快速排序
其实libc中有qsort函数的,用于数组型数据排序还是很好的。
话说,好久没用过排序算法了……
工作需要,就自己重新写了一个。用[0]作为分界。
/* 用[0]作为分界
* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 * * 18 35 27 19 05 34 28 67 23 17 45 98 06 18 43 24 * 06 35 * 17 27 * 05 19 * 05 18 * 05 06 17 18 19 34 28 67 23 27 45 98 35 18 43 24 * 05 06 17 * 06 17 * 17 * 19 34 28 67 23 27 45 98 35 18 43 24 * 18 34 * 18 19 * 18 19 28 67 23 27 45 98 35 34 43 24 * 18 * 28 67 23 27 45 98 35 34 43 24 * 24 67 * 27 28 * 27 24 23 28 45 98 35 34 43 67 * 27 24 23 * 23 27 * 23 24 27 * 23 24 * 24 * 45 98 35 34 43 67 * 43 98 * 34 45 * 34 43 35 45 98 67 * 34 43 35 * 43 35 * 35 43 * 98 67 * 67 98 * 05 06 17 18 18 19 23 24 27 28 34 35 43 45 67 98 * */ #include <stdio.h> void *buf_getitem(void *buf, int i) { int *buf_local = buf; return &buf_local[i]; } void buf_swap(void *buf, int i, int j) { int *buf_local = buf; int temp = buf_local[i]; buf_local[i] = buf_local[j]; buf_local[j] = temp; } int buf_compare(void *buf, int i, int j) { int *buf_local = buf; if(buf_local[i] < buf_local[j]) return -1; else if(buf_local[i] > buf_local[j]) return 1; else return 0; } void quick_sort(void *buf, void (*swap)(void *buf, int i, int j), int (*compare)(void *buf, int i, int j),// 1: [i] > [j];-1:[i] < [j] int len) { if(len < 2) return; if(len == 2) { if(compare(buf, 0,1) > 0) swap(buf, 0,1); return; } int i = 1; int j = len - 1; while(i < j) { if(compare(buf, i,0) < 0) { i++; continue; } if(compare(buf, j,0) >= 0) { j--; continue; } swap(buf, i, j); } if(j == 1) // [0]后的数据都大于[0] quick_sort(buf_getitem(buf, 1), buf_swap, buf_compare, len - j); else if(j == len - 1) // [0]后的数据都小于[0] {
if(compare(buf, 0, j) > 0) swap(buf, 0, j); quick_sort(buf, swap, compare, j); } else { swap(buf, 0, j - 1); quick_sort(buf, swap, compare, j - 1); quick_sort(buf_getitem(buf, j), swap, compare, len - j); } } int main() { int buf[16] = { 18,35,27,19, 5,34,28,67, 23,17,45,98, 6,18,43,24}; quick_sort(buf, buf_swap, buf_compare, 16); for(int k = 0; k < 16; k++) printf("%02d ",buf[k]); printf("\n"); return 0; }
浙公网安备 33010602011771号