C的数据结构八种排序算法的 代码及分析
- 格式:docx
- 大小:36.78 KB
- 文档页数:13
二、选择排序
①初始状态:无序区为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; 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; } 比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。 优点:稳定,比较次数已知; 缺点:慢,每次只能移动相邻两个数据,移动数据的次数多。 初始关键字 [49 38 65 97 76 13 27 49] 第一趟排序后 [38 49 65 76 13 27 49] 97 第二趟排序后 [38 49 65 13 27 49] 76 97 第三趟排序后 [38 49 13 27 49] 65 76 97 第四趟排序后 [38 13 27 49] 49 65 76 97 第五趟排序后 [38 13 27] 49 49 65 76 97 第六趟排序后 [13 27]38 49 49 65 76 97 第七趟排序后 [13] 27 38 49 49 65 76 97 最后排序结果 13 27 38 49 49 76 76 97 #include using namespace std; void main() {