经典算法之快速排序的C实现方法
2015-06-06 18:25
453 查看
这里所实现的快速排序是参考《算法导论》上的伪代码,虽然之前对着伪代码敲过一遍,可是现在抛开伪代码,自己敲还是有些费劲。<-_->!!
特别需要注意的是算法导论中的快排方法,和课上讲的不太一样,课上讲的主要是利用首尾两个下标来实现, 而算法导论中,主要是 从前到后,依次判断,将小于privot 的值全部移到 i 的前面去。这里 i 是指 小于 privot值的下标上界。
源代码如下:
特别需要注意的是算法导论中的快排方法,和课上讲的不太一样,课上讲的主要是利用首尾两个下标来实现, 而算法导论中,主要是 从前到后,依次判断,将小于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); }
相关文章推荐
- POJ2031 Building a Space Station
- 编程算法 - 合并订单列表
- 2d ui菜单进入出去
- 初学DWR开源框架
- height:100%和height:auto的区别
- DaoCloud部署Node
- XmlSerializer 常见问题疑难解答(MSDN)
- vim基本命令(转载自网络)
- 多物体运动框架
- 【Android】两个日期相差几天和两个日期比较大小
- Mysql面试题及答案
- Hbase总结(四)- Hbase与传统数据库的区别
- unity3D LineRender的使用
- 【BZOJ】【3668】【NOI2014】起床困难综合症
- Oracle数据库创建与安装_超越OCP精通Oracle视频教程培训02~04
- android 实现UDP发送和接收
- MAC OSX使用篇
- hdu2393Higher Math
- 安装配置Jstorm集群
- EL表达式学习笔记