C語言實現氣泡排序和簡單選擇排序
氣泡排序(Bubble Sort)的基本思想為兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序記錄為止。
其時間複雜度為O(n^2)。
簡單選擇排序(Simple Selection Sort)的基本思想是通過n-i次關鍵字的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i個記錄交換。
其時間複雜度為O(n^2),但效能上還是略優於氣泡排序。
以下程式在DEV C++中除錯執行通過。
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct { int r[10]; int lenght; }SqList; void swap(SqList *L,int i,int j) { int temp=L->r[i]; L->r[i]=L->r[j]; L->r[j]=temp; } void BubbleSort(SqList *L) { int i,j; int flag=1; for(i=1;i<L->lenght&&flag;i++) { flag=0; for(j=L->lenght-1;j>=i;j--) { if(L->r[j]>L->r[j+1]) { swap(L,j,j+1); flag=1; } } } } void SelectSort(SqList *L) { int i,j,min; for(i=1;i<L->lenght;i++) { min=i; for(j=i+1;j<L->lenght;j++) { if(L->r[min]>L->r[j]) min=j; } if(i!=min) swap(L,i,min); } } int main() { SqList L; int k; L.lenght=10; int temp[10] ={0,9,1,5,8,3,7,4,6,2}; memcpy(L.r, temp, 10*sizeof(int)); printf("氣泡排序前:"); for(k=1;k<10;k++) printf("%d,",L.r[k]); printf("\n"); //L.r[10]={0,9,1,5,8,3,7,4,6,2}; BubbleSort(&L); printf("氣泡排序後:"); for(k=1;k<10;k++) printf("%d,",L.r[k]); printf("\n"); memcpy(L.r, temp, 10*sizeof(int)); printf("簡單選擇排序前:"); for(k=1;k<10;k++) printf("%d,",L.r[k]); printf("\n"); //L.r[10]={0,9,1,5,8,3,7,4,6,2}; SelectSort(&L); printf("簡單選擇排序後:"); for(k=1;k<10;k++) printf("%d,",L.r[k]); printf("\n"); }
執行結果如圖所示。
【小問題:結構體中陣列賦值】
這裡待排序的記錄存在結構體中的一個數組中,在定義完結構體後,不能通過L.r[10]={0,9,1,5,8,3,7,4,6,2};對陣列進行賦值,會報錯,因為這樣的格式是在陣列定義的時候使用,陣列定義後,就不能再這樣賦值了,只能一個個下標去賦值;或者對陣列按指標操作,完成記憶體塊的賦值。這裡使用int
temp[10] ={0,9,1,5,8,3,7,4,6,2};
memcpy(L.r, temp, 10*sizeof(int));這樣的方式進行賦值。