仅仅先复习简单的排序
函数原型
//直接插入排序 //a[0]作为监视哨 void Dir_Insert(data_t a[],int N) { int i, j; for (i = 2; i < N; i++) { a[0] = a[i]; j = i - 1; while (a[j] > a[0]) { a[j + 1] = a[j]; j--; } a[j + 1] = a[0]; } } //折半插入排序 void Binsort(data_t a[], int N) { int i, j, low, high, mid; for (i=2; i<N; i++) { a[0] = a[i]; low = 1; high = i; while (low <= high) { mid = (low + high) / 2; if (a[0] >= a[mid]) { low = mid + 1; } else { high = mid - 1; } } for (j=i-1; j>=low; j--) { a[j + 1] = a[j]; } a[low] = a[0]; } } //冒泡排序 void Bubsort(data_t a[], int N) { int i, j, tmp; for (i = 0; i < N - 1; i++) { for (j = 0; j < N - i - 1; j++) { if (a[j] > a[j + 1]) { a[j] ^= a[j + 1]; a[j + 1] ^= a[j]; a[j] ^= a[j + 1]; } } } } //快速排序 void qksort(data_t a[], int left, int right) { if (left >= right) { return; } int i = left; int j = right; data_t key = a[left]; while (i < j) { while (i<j && key<=a[j]) { j--; } a[i] = a[j]; while (i<j && key>=a[i]) { i++; } a[j] = a[i]; } a[i] = key; qksort(a, left, i - 1); qksort(a, i + 1, right); return; }
测试代码
void show(data_t a[], int left, int right) { int i; for (i = left; i < right; i++) { printf("%d ", a[i]); } printf(" "); } int main(int argc, char *argv[]) { data_t a[11] = {0,9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; Dir_Insert(a, 11); show(a, 1, 11); data_t b[11] = {0,9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; Binsort(b, 11); show(b, 1, 11); data_t c[11] = {0,9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; Bubsort(c, 11); show(c, 1, 11); data_t d[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; qksort(d, 0, 9); show(d, 0, 10); return 0; }
结果
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9