C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些。
- 简单交换法排序
1 /*简单交换法排序 2 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 3 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动 4 不稳定 5 */ 6 #include<windows.h> 7 #include<stdio.h> 8 void main(){ 9 int i,j,arr[10]={20,36,58,23,10,9,14,99,3,66},t; 10 int size = sizeof(arr)/sizeof(int);//计算数组的大小 11 for(i = 0;i< size-1;i++){//n个数进行n-1轮比较 12 for(j = i+1;j< size;j++)//每一轮比较时,后面的数与i为下标的数比较 13 if(arr[j]<arr[i]){//如果i为下标的数比后面的一个数大,将两个数交换位置 14 t=arr[j]; 15 arr[j]=arr[i]; 16 arr[i]=t; 17 } 18 } 19 20 for(i = 0;i< size;i++){//输出 21 printf("%d ",arr[i]); 22 } 23 24 system("pause"); 25 }
- 直接选择排序
1 /*选择排序 2 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 3 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) 4 */ 5 #include<windows.h> 6 #include<stdio.h> 7 void main(){ 8 int min,i,j,arr[10]={20,36,58,23,10,9,14,99,3,66},t; 9 int size = sizeof(arr)/sizeof(int);//计算数组的大小 10 for(i = 0; i< size-1;i++){//n个数进行n-1轮比较 11 min = i;//每一轮假定i为下标的这个数为最小值,记录下标 12 for(j = i+1;j < size;j++)//每一轮比较时,后面的数与min为下标的数比较 13 if(arr[j]<arr[min]) min = j;//后面的数比min为下标的数小,更换min 14 if(min != i){//如果min的值发生了变化即当前下标为i的数不是最小值,交换 15 t = arr[i]; 16 arr[i]=arr[min]; 17 arr[min] = t; 18 } 19 } 20 21 for(i = 0;i< size;i++){//输出 22 printf("%d ",arr[i]); 23 } 24 25 system("pause"); 26 27 }
- 冒泡排序
/*冒泡排序 重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成 */ #include<windows.h> #include<stdio.h> void main(){ int min,i,j,arr[10]={20,36,58,23,10,9,14,99,3,66},t,noswap; int size = sizeof(arr)/sizeof(int);//计算数组的大小 for(i = 0; i< size-1;i++){//n个数进行n-1轮比较 noswap = 1;//标记是否发生交换,以避免对已经有序的序列再排序 for(j = 0;j<size-1-i;j++){ if(arr[j]>arr[j+1]){//如果前一个数比后一个数大,交换 t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; noswap = 0;//发生了交换 } } if(noswap) break; //没有发生交换,说明已经有序,无需再排序,退出循环 } for(i = 0;i< size;i++){//输出 printf("%d ",arr[i]); } system("pause"); }