您的位置:首页 > 其它

经典算法之快速排序的C实现方法

2015-06-06 18:25 453 查看
这里所实现的快速排序是参考《算法导论》上的伪代码,虽然之前对着伪代码敲过一遍,可是现在抛开伪代码,自己敲还是有些费劲。<-_->!!

特别需要注意的是算法导论中的快排方法,和课上讲的不太一样,课上讲的主要是利用首尾两个下标来实现, 而算法导论中,主要是 从前到后,依次判断,将小于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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: