思想就是在区间中随机挑选一个元素作基准,将小于基准的元素放在基准之前,大于基准的元素放在基准之后。之后再分别对上一波基准划分的小数区间与大数区间进行同样方式的排序。之后的分治办法也是很方便并行处理的。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/time.h>
void ShowSortPro(int arr[], int len)
{
int i;
for (i=0; i<len; i++)
printf("%6d ", arr[i]);
printf(" \n");
}
typedef struct _Range {
int start, end;
} Range;
Range new_Range(int s, int e) {
Range r;
r.start = s;
r.end = e;
return r;
}
void selfswap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
//
// 快速排序
// 输入参数:数组
// 数组的长度
//
void QuickSort(int arr[], const int len) {
if (len <= 0)
return;
Range r[len];
int p = 0;
r[p] = new_Range(0, len - 1);
p++;
while (p) {
--p;
Range range = r[p];
if (range.start >= range.end)
continue;
int mid = arr[(range.start + range.end) / 2]; // 中间基点
int left = range.start, right = range.end; // 两端开始
printf("============================================================================== %d %d\n", range.start, range.end);
printf("============================================================================== mid %d %d\n", (range.start + range.end) / 2, mid);
do {
while (arr[left] < mid) ++left; // 基点左
while (arr[right] > mid) --right; // 基点右
if (left <= right) {
printf("%d ---- %d ", left, right);
selfswap(&arr[left],&arr[right]);
left++;right--;
ShowSortPro(arr, len);
}
} while (left <= right);
printf("============================================================================== mid %d %d\n\n", (range.start + range.end) / 2, mid);
if (range.start < right) {
r[p] = new_Range(range.start, right);
p++;
}
if (range.end > left) {
r[p] = new_Range(left, range.end);
p++;
}
}
}
void main() {
int arr[] = { 65, 75, 59, 26, 92, 19, 8, 67 };
int len;
// sizeof是运算符,不是函数
// sizeof能求得静态分配内存的数组的长度,即占用内存的大小,以byte为单位
len = (int) sizeof(arr) / sizeof(arr[0]);
//printf("%ld \n", sizeof(arr));
//printf("%ld \n", sizeof(arr[0]));
ShowSortPro(arr, len);
printf("============================================================START\n");
QuickSort(arr, len);
printf("============================================================END\n");
ShowSortPro(arr, len);
}
测试编译器对代码进行自动优化编译和不优化的耗时比较。感兴趣的可以试试其他级别的优化,这里要注意优化后程序的结果要正确耗时比较才有意义。