之前學過的數據結構課,貌似已經忘得一乾二淨了,偶然又翻起,書中最後一章詳細介紹了7種排序算法,如今對其中4種作個總結。(爲啥只總結4種,固然是由於偷懶,只想總結簡單又經常使用的!)算法
先貼一張排序分類圖:數據結構
主要思想:每次比較相鄰的兩個數,較小的數向上冒,較大的數向下沉。 |
演示效果:spa
C代碼:(指針p指向待排序列的首地址,length是待排序列的總長度,下同)3d
swap(int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } Msort(int *p, int length) { BOOLEAN flag = TRUE; for (int i = 0; i < length && flag; i++){ flag = FALSE; for (int j = length - 1; j > i; j--) if (*(p + j) < *(p + j - 1)) { swap(p + j, p + j - 1); flag = TRUE; } } }
主要思想:每輪循環找到一個最小數的標號,循環結束後進行一次交換。 |
演示效果:指針
C代碼:code
swap(int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; }
Xsort(int *p, int length) { for (int i = 0; i < length - 1; i++){ int min = i; for (int j = i + 1; j < length; j++){ if (*(p + j) < *(p + min)) min = j; } if (min != i) swap(p + i, p + min); } }
主要思想:每輪循環都是實現將一個新來的數插入到原有的一個有序子序列中。 |
演示效果:blog
C代碼:排序
swap(int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } Csort(int *p, int length) { for (int i = 1; i < length; i++){ if (*(p + i) < *(p + i - 1)){ int tmp = *(p + i); int j; for (j = i - 1; j >= 0 && *(p + j) > tmp; j--) *(p + j + 1) = *(p + j); *(p + j + 1) = tmp; } } }
冒泡排序的升級版,同屬於交換排序。遞歸
主要思想:經過遞歸,不斷地二分序列,使相對較大的數位於一邊,相對較小的數位於另外一邊。 |
演示效果:it
C代碼:
swap(int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } int partition(int *p, int startIdx, int endIdx) { int pivotkey; pivotkey = *(p + startIdx); while (startIdx < endIdx) { while (startIdx < endIdx && *(p + endIdx) >= pivotkey) endIdx--; swap(p + startIdx, p + endIdx); while (startIdx < endIdx && *(p + startIdx) <= pivotkey) startIdx++; swap(p + startIdx, p + endIdx); } return startIdx; } Ksort(int *p, int startIdx,int endIdx) { int pivot; if (startIdx < endIdx) { pivot = partition(p,startIdx,endIdx); Ksort(p, startIdx, pivot - 1); Ksort(p, pivot + 1, endIdx); } }
//2018-8-20 //by-lengwawa #include<stdio.h> #include<Windows.h> //程序中的BOOLEAN在該頭文件中定義
main() { int n, i; int *p; p = NULL; printf("請輸入須要排序的個數:"); scanf_s("%d", &n); p = (int *)malloc(n*sizeof(int)); printf("\n請輸入%d個待排序的數:", n); for (int k = 0; k < n; k++) scanf_s("%d", p + k); printf("\n你要使用哪一種排序法(1——冒泡 2——選擇 3——插入 4——快排):"); scanf_s("%d", &i); printf("\n"); if (i == 1) { printf("使用冒泡排序法的結果是:"); Msort(p, n); for (int j = 0; j < n; j++) printf("%d ", *(p + j)); printf("\n\n\n"); } else if (i == 2) { printf("使用選擇排序法的結果是:"); Xsort(p, n); for (int j = 0; j < n; j++) printf("%d ", *(p + j)); printf("\n\n\n"); } else if (i == 3) { printf("使用插入排序法的結果是:"); Csort(p, n); for (int j = 0; j < n; j++) printf("%d ", *(p + j)); printf("\n\n\n"); } else { printf("使用快速排序法的結果是:"); Ksort(p, 0, n - 1);//這裏是標號,因此是n-1 for (int j = 0; j < n; j++) printf("%d ", *(p + j)); printf("\n\n\n"); } }
選擇法升級版——堆排序:
插入法升級版——希爾排序:
歸併排序: