快速排序
定义
- data:需要排序的元素向量,元素下标从0开始
- l_ptr:data的左边界
- r_ptr:data的有边界
- flag:基准值、基准
- 基准值左边:小于基准值的元素
- 基准值右边: 大于等于基准值的元素
基本思想
- 1、在当前无序区data[l]到data[r]中任取一个记录作为比较的基准值flag
- 2、用此基准值将当前无序区划分为左右两个较小的无序区:
- 即:data[l] 到 data[k - 1] 和 data[k + 1] 到 data[r]
- k为flag最后插入的位置:即data[l] 到 data[k - 1] <= flag <= data[k + 1] 到 data[r]
- data[l] 到 data[k - 1] :为小于flag的无序区
- data[k + 1] 到 data[r] :为大于等于flag的无序区
- 3、data[l] 到 data[k - 1] 和 data[k + 1] 到 data[r] 非空时,将重复上述1、2步骤。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int dataType;
void quickSort(dataType *head, int l_ptr, int r_ptr) {
if (l_ptr >= r_ptr) return ;
dataType flag = *(head + ((l_ptr + r_ptr) >> 1));
int l = l_ptr, r = r_ptr;
while (l < r) {
while (l < r && head[r] >= flag) --r;
if (l < r) { head[l] = head[r]; ++l; }
while (l < r && head[l] < flag) ++l;
if (l < r) { head[r] = head[l]; --r; }
}
head[r] = flag;
quickSort(head, l_ptr, r - 1);
quickSort(head, r + 1, r_ptr);
return ;
}
#define N 40
int main() {
srand(time(NULL));
dataType data[N];
for (int i = 0; i < N; ++i) data[i] = rand() % 1000;
puts("排序前:");
for (int i = 0; i < N; ++i) printf("%d ", data[i]);
quickSort(data, 0, N - 1);
puts("\n排序后:");
for (int i = 0; i < N; ++i) printf("%d ", data[i]);
return 0;
}