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"); }