首先初始化了一個MAX大小的數組,用亂序函數將數組打亂,用於測試各個排序函數,先附上要測試的幾個基礎排序函數,後面附上亂序函數和主調度函數。代碼就那麼幾行,只是註釋的思亂佔了比較多的行數shell
快速排序數組
//快速排序,思想的重點是 遞歸+分組(分治)+先後交叉操做 void quickSort(int *array, int low, int hight) { //判斷是否知足條件 if (hight <= low) //若是隻有一個元素或者先後錯位了,就不用排序了,一個元素就是成序的 return; //知足排序條件,進入排序部分 int i = low, j = hight; //定義函數內的臨時變量爲low和hight的副本,避免修改low和 hight,後面還要使用 int temp = array[low]; //對整個序列進行一次篩選,以目標值爲分割點,只有當i<j時表示遍歷沒有完成,須要繼續遍歷 while (i < j){ while (i<j && array[j]>temp){ j--; } if (i < j){ array[i++] = array[j]; } while (i < j && array[i] < temp){ i++; } if (i < j){ array[j--] = array[i]; } } //循環跳出,證實i=j,遍歷相遇,一輪篩選完成,將目標數放在中間 array[i] = temp; //遞歸部分 //將前半部分交給快排函數 quickSort(array, low, i - 1); //將後半部分交給快拍函數 quickSort(array, i + 1, hight); }
shell排序(基於插入排序)函數
//shell排序(希爾排序) void shellSort(int *array, int size, int d) { //循環1 控制步長的循環 for (int increment = d; increment > 0; increment /= 2){ //循環2 屬於插入排序內容,控制遍歷次步長能夠訪問到的元素 for (int i = increment; i < size; i += increment){ int temp = array[i]; int j = i - increment; //循環3 屬於插入排序內容,賦值尋找目前元素能夠插入的位置 while (j >= 0 && array[j]>temp){ array[j + increment] = array[j]; j -= increment; } array[j + increment] = temp; } } }
shell排序(基於選擇排序)測試
相比於基於插入排序實現的shell排序,這個看起來循環多,實現的時候邏輯也不簡單于基於插入排序,ui
不知道是我寫的問題,仍是問題的自己就是這樣的,求指教spa
void shellSort2(int *array, int size, int d) { //循環1,控制步長變化,直到步長爲1也執行後結束 for (int increment = d; increment > 0; increment /= 2){ //循環2,找出每組的開頭 for (int k = 0; k < increment; k++){ //循環3,屬於選擇排序範圍了,對上面提供的開頭的組內元素作選擇排序 for (int i = k; i < size - 1; i += increment){ int tempIndex = i; //循環4,屬於選擇排序 for (int j = i + increment; j < size; j += increment){ if (array[j] < array[tempIndex]){ tempIndex = j; } } if (tempIndex != i){ int temp = array[i]; array[i] = array[tempIndex]; array[tempIndex] = temp; } } } } }
輔助的操做函數,包括 亂序函數,打印數組函數,交換元素值得函數code
//交換函數 void swap(int *a, int *b) { int c = *a; *a = *b; *b = c; } //亂序函數,經過從後往前遍歷數組,使得當前索引的值與隨機一個比它索引小的元素交換 void shuffle(int *array, int size) { srand((unsigned int)time(NULL)); for (int i = size - 1; i > 0; i--){ int index = rand() % i; swap(&array[i], &array[index]); } } //打印數組函數 void printArray(int *array, int size) { for (int i = 0; i < size; i++){ printf("%d\t",array[i]); } }
主函數,負責測試各個排序函數排序
int main() { //定義並初始化數組 int array[MAX] = { 0 }; for (int i = 0; i < MAX; i++){ array[i] = i; } //對數組數據進行亂序 shuffle(array, MAX); //打印亂序後的數組 printArray(array, MAX); //測試各個排序的效果 /*printf("\n快速排序後\n"); quickSort(array, 0, MAX - 1); printArray(array, MAX);*/ printf("\nshell排序後\n"); shellSort(array, MAX, MAX / 2); printArray(array, MAX); return 0; }