C的数据结构八种排序算法的 代码及分析

  • 格式:docx
  • 大小:36.78 KB
  • 文档页数:13

下载文档原格式

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

二、选择排序

①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R[i..n](1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区.这样,n 个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

优点:稳定,比较次数与冒泡排序一样;

缺点:相对之下还是慢。

初始关键字[49 3865 97 76 13 27 49]

第一趟排序后13 [38 65 97 76 49 27 49]

第二趟排序后13 27 [65 97 76 49 38 49]

第三趟排序后13 2738 [97 76 49 65 49]

第四趟排序后13 2738 49 [49 97 65 76]

第五趟排序后13 2738 49 49 [97 97 76]

第六趟排序后13 2738 49 49 76 [76 97]

第七趟排序后13 2738 49 49 76 76 [ 97]

最后排序结果13 2738 49 49 76 76 97

#include

using namespace std;

void main()

{

inti,j,k,t;

int R[8]={49,38,65,97,76,13,27,49};

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

{

k=i;

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

if(R[j]

k=j;

if(k!=i)

{

t=R[i];R[i]=R[k];R[k]=t;

}

}

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

cout<

一、冒泡排序(小者上扬原则)

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再#include

#include

int main(void) {

int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};

int temp[10][10] = ;

int order[10] = ;

int i, j, k, n, lsd;

k = 0;

n = 1;

printf("/n排序前: ");

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

printf("%d ", data);

putchar('/n');

while(n <= 10) {

for(i = 0; i < 10; i++) {

lsd = ((data / n) % 10);

temp[lsd][order[lsd]] = data;

order[lsd]++;

}

printf("/n重新排列: ");

for(i = 0; i < 10; i++) {

if(order != 0)

for(j = 0; j < order; j++) {

data[k] = temp[j];

printf("%d ", data[k]);

k++;

}

order = 0;

}

n *= 10;

k = 0;

}

putchar('/n');

printf("/n排序后: ");

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

printf("%d ", data);

return 0;

}

#include

#include

int main(void) {

int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81}; int temp[10][10] = ;

int order[10] = ;

int i, j, k, n, lsd;

k = 0;

n = 1;

printf("/n排序前: ");

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

printf("%d ", data);

putchar('/n');

while(n <= 10) {

for(i = 0; i < 10; i++) {

lsd = ((data / n) % 10);

temp[lsd][order[lsd]] = data;

order[lsd]++;

}

printf("/n重新排列: ");

for(i = 0; i < 10; i++) {

if(order != 0)

for(j = 0; j < order; j++) {

data[k] = temp[j];

printf("%d ", data[k]);

k++;

}

order = 0;

}

n *= 10;

k = 0;

}

putchar('/n');

printf("/n排序后: ");

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

printf("%d ", data);

return 0;

}

#include

#include

int main(void) {

int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81}; int temp[10][10] = ;

int order[10] = ;

int i, j, k, n, lsd;

k = 0;

n = 1;