C的数据结构八种排序算法的 代码及分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;