排序 快速排序
这里有一些基本的排序的介绍,当然只是为了我自己个人理解:-)
所谓的快速排序,其实就是以数组的最后一个数值为基准,其他的都和他相比,比他大的,就放到右边,比他小的就放到左边。如果我们定义一个 i = -1,那么每次我们 扫一遍 发现有比 参照 小的,就让i+1,然后把这个比 参照 小的数和现在的i对应的值交换。通过这一遍我们可以发现 参照 所在的位置应该是在i+1处。通过这一遍,我们仅能确定 这个参照所在的位置
算法导论的写法
/* * CreateTime: 2014-12-23 14:49:21 */ #include <stdio.h> int a[10] = { 12, 2, 16, 30, 28, 10, 16, 20, 6, 18 }; void swap(int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } int partition(int l, int r) { int i = l - 1; int k = a[r]; for (int j = l; j < r; j++) { if (a[j] < k) { i++; swap(i, j); } } swap(i+1, r); // 恰好在 i 的位置,从 l~i 都是小 a[r] 的 // 所以 a[r] 的位置在 i+1 上,这时 a[r] 是拍好序的 return i+1; } void qsort1(int l, int r) { if (l < r) { int m = partition(l, r); qsort1(l, m-1); qsort1(m+1, r); } } int main(void) { qsort1(0, 9); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }
三切向的写法
/* * CreateTime: 2014-11-17 13:24:40 */ #include <stdio.h> int a[10] = { 1, 454, 634,34, 3, 3, 2343, 23435, 34, 42 }; void swap (int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } void quick3(int l, int r) { if(l < r) { int lt = l; int gt = r; int i = l + 1; int key = a[l]; while(i <= gt) { if(a[i] < key) { swap(i++, lt++); } else if(a[i] > key) { swap(i, gt--); } else { i++; } } quick3(l, lt-1); quick3(gt+1, r); } } int main(void) { quick3(0, 9); for(int i = 0; i < 10; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }