数据结构内部排序

  • 格式:doc
  • 大小:234.50 KB
  • 文档页数:4

下载文档原格式

  / 4
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.实验目的

通过上机实验对各种内部排序方法进行比较。

2.实验内容与要求

⑴实现三种以上内部排序方法;

⑵生成随机数以构造待排表;

⑶记录运行结果并加以分析。

3.数据结构设计

逻辑结构:线性结构

存储结构:顺序存储结构

4.算法设计

#include

#include

#include

#define MAXSIZE 20

typedef struct

{

int key;

}RedType;

typedef struct

{

RedType r[MAXSIZE+1];

int length;

}SqList;

int Partition(SqList &L, int low, int high) { // 算法10.6(b)

// 交换顺序表L中子序列L.r[low..high]的记录,使枢轴记录到位,

// 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它

int pivotkey;

L.r[0] = L.r[low]; // 用子表的第一个记录作枢轴记录

pivotkey = L.r[low].key; // 枢轴记录关键字

while (low

{ // 从表的两端交替地向中间扫描

while (low=pivotkey)

--high;

L.r[low] = L.r[high]; // 将比枢轴记录小的记录移到低端

while (low

++low;

L.r[high] = L.r[low]; // 将比枢轴记录大的记录移到高端

}

L.r[low] = L.r[0]; // 枢轴记录到位

return low; // 返回枢轴位置

} // Partition

void QSort(SqList &L, int low, int high)

{ //算法10.7

// 对顺序表L中的子序列L.r[low..high]进行快速排序

int pivotloc;

if (low < high)

{ // 长度大于1

pivotloc = Partition(L, low, high); // 将L.r[low..high]一分为二

QSort(L, low, pivotloc-1); // 对低子表递归排序,pivotloc是枢轴位置

QSort(L, pivotloc+1, high); // 对高子表递归排序

}

} // QSort

void QuickSort(SqList &L)

{ // 算法10.8

// 对顺序表L进行快速排序

QSort(L, 1, L.length);

} // QuickSort

int PrintList(SqList L)

{

int i;

printf("排序的得到的结果为\n");

for(i = 1 ; i <= L.length ; i++)

printf("%d\t",L.r[i].key);

printf("\n");

return 1;

}

int SelectMinKey(SqList L,int i)

{

int j,min,minj;

min = L.r[i].key;

minj = i;

for(j = i ; j <= L.length ; j++)

{

if(min > L.r[j].key)

{

min = L.r[j].key;

minj = j;

}

}

return minj;

}

void SelectSort(SqList &L)

{ // 算法10.9

// 对顺序表L作简单选择排序。

int i,j;

for (i=1; i

{ // 选择第i小的记录,并交换到位

j = SelectMinKey(L, i); // 在L.r[i..L.length]中选择key最小的记录

if (i!=j)

{ // L.r[i]←→L.r[j]; 与第i个记录交换

RedType temp;

temp=L.r[i];

L.r[i]=L.r[j];

L.r[j]=temp;

}

}

} // SelectSort

void BubbleSort(SqList &L)

{

int i,j,change,temp;

for(i = L.length ,change = 1; i >= 1 && change ; --i)

{

change = 0;

for(j = 0 ; j < i ; j++)

if(L.r[j].key > L.r[j+1].key)

{

temp = L.r[j].key;

L.r[j].key = L.r[j+1].key;

L.r[j+1].key = temp;

change = 1;

}

}

}

int main()

{

SqList L;

int i,j;

srand((int)time(0)); //设置随机数种子

printf("请输入需要随机生成的无序表的长度\n");

printf("不要超过20\n");

scanf("%d",&j);

L.r[0].key = 0;

for(i = 1 ; i <= j ; i++ )

{

L.r[i].key = (int)rand()%100;

}

L.length = j;

printf("首先是冒泡排序法\n");

printf("随机序列如下\n");

PrintList(L);

BubbleSort(L);

printf("排序结束\n");