使用左指针l, 右指针r. 首先从数组里挑第0个元素的值作为key, 右指针从右往左,把每个数与key对比, 直到找到比key小的数, 把找到的数存到左指针指向的位置里, 左指针往右偏移一个位置. 这时右指针的移动结朿, 左指针开始往右移, 把指向的数与key对比, 直到找到比key大的数, 然后把找到的数保存到右指针指向的位置里, 然后右指针往左移动一个位置. 接右指针移....左指针移... 直到左右指针指向同一位置, 则把key的值写到此位置上. 到这里一轮结束. 一轮结束后,比key大的数应在key的右边, 比key小的数应在key的左边. 接着从第0元素到左指针-1的区域重复排序, 从右指针+1到最后一个元素位置的区域也重新排序
#include <stdio.h> #include <stdlib.h> void list(int *data, int , int ); int main(void) { int data[100]; int i; for(i = 0; i < 100; i++) { data[i] = random()%1000; printf("%03d ",data[i]); } printf("\n"); list(data, 0, 99); for(i = 0; i< 100; i++) { printf("%03d ", data[i]); } printf("\n"); } void list(int *data, int l, int r) { int kay, l_old = l, r_old=r; if(l > r) return; kay = data[l]; while(l != r) { while((data[r] > kay) && (l !=r)) r--; if(r == l) break; data[l] = data[r]; l++; while((data[l] < kay) && (l != r)) l++; if(r == l) break; data[r] = data[l]; r--; } data[r] = kay; list(data, l_old, l-1); list(data, r+1, r_old); }