这里所实现的快速排序是参考《算法导论》上的伪代码,虽然之前对着伪代码敲过一遍,可是现在抛开伪代码,自己敲还是有些费劲。<-_->!!
特别需要注意的是算法导论中的快排方法,和课上讲的不太一样,课上讲的主要是利用首尾两个下标来实现, 而算法导论中,主要是 从前到后,依次判断,将小于privot 的值全部移到 i 的前面去。这里 i 是指 小于 privot值的下标上界。
源代码如下:
// =====================【快速排序】==================
// @ author : zhyh2010
// @ date : 20150606
// @ version : 1.0
// @ description :
// =====================【快速排序】==================
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM 20
int arr[NUM] = { 0 };
void init()
{
time_t tm;
time(&tm);
srand((unsigned int)tm);
int max_item = 100;
for (int i = 0; i != NUM; i++)
arr[i] = rand() % max_item;
}
void swap(int * pa, int * pb)
{
int aa = *pa;
int bb = *pb;
aa = aa ^ bb;
bb = aa ^ bb;
aa = aa ^ bb;
*pa = aa;
*pb = bb;
}
int partition(int low, int high)
{
int i = low - 1; // 标记 <= privot的上限
int privot = arr[high];
for (int j = low; j != high; j++)
{
if (arr[j] <= privot) // 把小的值移到 i 前面去
swap(&arr[++i], &arr[j]);
}
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
void display(int * arr)
{
for (int i = 0; i != NUM; i++)
printf("%-10d", arr[i]);
printf("\n");
}
void QuickSort(int low, int high)
{
if (low >= high)
return;
int mid = partition(low, high);
QuickSort(low, mid - 1);
QuickSort(mid + 1, high);
}
void main()
{
init();
printf("快速排序前\n");
display(arr);
QuickSort(0, NUM - 1);
printf("快速排序后\n");
display(arr);
}
原文地址:http://blog.csdn.net/zhyh1435589631/article/details/46390449