快速排序中的核心函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 int Partition (int a[], int start, int end) { int i = start, j = end; int x = a[i]; while (i < j) { while (i < j && a[j] >= x) j--; if (i < j) { a[i] = a[j]; i++; } while (i < j && a[i] < x) i++; if (i < j) { a[j] = a[i]; j--; } } a[i] = x; return i; }
快速排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void _qsort(int *a, int start, int end){ if (start >= end) { return ; } int i = Partition(a,start,end); _qsort(a, start, i-1 ); _qsort(a, i+1 , end); } void Qsort (int *a, int len) { if (a == NULL || len <= 0 ) return ; int start = 0 ; int end = len -1 ; _qsort(a, start, end); }
快速排序对于在内存中的数据排序很有效,但如果数据位于磁盘且数据量巨大,则归并排序可能更适合。因为可以使用多个线程(通道)进行固定大小的排序,最后将排序结果归并即可,这些操作仍是需要进行专门设计的
实际使用快速排序不是使用我们的轮子^v^, eg. vs下使用快速排序(.c):
1 2 3 4 5 6 7 8 9 10 11 #include <stdlib.h> #include <algorithm> #define SIZE 100 int gArray[SIZE] = {……};int cmp (const void * a, const void *b) { return (*(int *)a - *(int *)b); } qsort(gArray, SIZE, cmp);
利用快排核心函数找第k小的数(<剑指offer p167>) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 int getKth (int *a, int len, int k) { if (a == NULL || len <= 0 ) return ; int s = 0 ; int e = len -1 ; int i=Partition(a,s,e); while (i != k-1 ) { if (i>k-1 ) { e = i-1 ; i = Partition(a,s,e); } if (i<k-1 ) { s = i+1 ; i = Partition(a,s,e); } } return a[i]; }
插入排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 int insertSort (int *a ,int len) { int i; for (i = 1 ;i <len; i++) { for (j = i; j>0 && a[j]<a[j-1 ]; j--) { a[j] <-> a[j-1 ]; } } } int insertSortBetter (int *a ,int len) { int i; for (i = 1 ;i <len; i++) { t = a[i]; for (j = i; j>0 && a[j]<a[j-1 ]; j--) { a[j] = a[j-1 ]; } a[j] = t; } }
归并排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 void mergeSort (int *a, int s, int e) { if (s < e) { int mid = (s+e)/2 ; mergeSort(a,s,mid); mergeSort(a,mid+1 ,e); merge(a,s,mid,e); } } void merge (int *a, int start, int mid, int end) { int i, j=0 ; int s1 = start, e1 = mid, s2 = mid+1 , e2 = end; int *tmp = (int *)malloc ((end-start+1 )*sizeof (int )); while (s1<= e1 && s2 <= e2) { if (a[s1] < a[s2]) tmp[j++] = a[s1++]; else tmp[j++] = a[s1++]; } while (s1 <= e1) tmp[j++] = a[s1++]; while (s2 <= e2) tmp[j++] = a[s2++]; for (i = 0 ; i<end-start+1 ;i++) a[start+i] = tmp[i]; free (tmp); }