quicksort算法思想
2015-11-02 14:20
218 查看
先贴在分析
void swap(int *x,int *y) { int temp; temp = *x; *x = *y; *y = temp; } int choose_pivot(int i,int j ) { return((i+j) /2); } void quicksort(int list[],int m,int n) { int key,i,j,k; if( m < n) { k = choose_pivot(m,n); swap(&list[m],&list[k]);// 把区分用的值放置在大小数组的中间 key = list[m];// key是下面划分数组的标准 i = m+1;// list[m] 已经确定为分组标准不进行判断 j = n; while(i <= j) { while((i <= n) && (list[i] <= key)) i++; while((j >= m) && (list[j] > key)) j--; if( i < j) swap(&list[i],&list[j]); } // 假设数组在递归到最后变成二元组 这一步负责交换二元组 swap(&list[m],&list[j]); // 递归地对较小的数据序列进行排序 quicksort(list,m,j-1);// 将一个完整的数组分成2个小的 然后递归 直至分成一个2元组 quicksort(list,j+1,n); } }
上动态图
看懂图题目解决大半
下面开始分析
1.我们先选择数组最中间的那一项, 默认他为数组的大小区分分界线,2,然后将数组后部大于分界线的移动到前半部分(这里可能有疑问后面说明)
3.然后项的排序就变成了 前x项和后(n - x)项的排序
重复1 . 2. 3步 直至对2个数字进行排序
疑问解释 :
quickrock函数开头部分交换list[m]和list[k]的意义是为了为下面的递归服务
后面的递归交换m和k是因为 k所代表的是分段之后小数组的最大值为了下次筛选我们将他与任意一个值进行交换(这里默认是M因为m一定在小数组内)当然这步也解决了如果数组中间项是数组最大值的问题。
最后所有的分组都完成之后递归向前回溯 从二元组开始一个个排序 然后3元组, 四元组 直至N元 排序完成。
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例