码迷,mamicode.com
首页 > 其他好文 > 详细

分治法快排

时间:2015-04-23 21:35:08      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

//快速排序,第一步确定一个关键值key(一般设置为第一个元素),一次快排基本思路是将比key小的数放在key的左边将比key大的数放在key右边,于是完成一次快排

接下来对key左边和右边分别递归采用同样方法

算法步骤:

   1.选择一个基准key(一般选第一个元素)

   2设定两个指针low和high,初始指向第一个元素和最后的一个元素

   3.先将high从右向左扫描直到找到比key小的元素,将此元素移到low位置,然后low从左向右扫描,找到比key大元素移动到high的位置

   一次快排结束的条件为low==high

   4.尾部工作,将key插到low位置

   5对low左边右边分别递归,重复以上做法

算法复杂度为O(nlogn)

#include<iostream>;
using namespace std;
void Qsort(int*list, int left, int right);
int main(){
int n,i;
while (cin >> n){
int *a = new int[n];
for (i = 0; i < n; i++)
cin >> a[i];
Qsort(a, 0, n - 1);
for (i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
}
void Qsort(int*list, int left, int right){
/*退出条件*/
if (left >= right)
return;
//设置关键值
int key = list[left];
//两个指针左右扫描
int low = left, high = right;
while (low < high){/*一次扫描结束标志*/
/*找到右边比key大的数*/
while (list[high]>=key&&high > low)
high--;
list[low] = list[high];//找到后移到低端
/*找出左边比key小的数*/
while (list[low]<= key&&high>low)
low++;
list[high] = list[low]; //找到后移到高端
}
list[low] = key;//最后一步将k插入,此时一次快排完毕
/*对两个子序列分别递归重复以上方法*/
Qsort(list, left, low-1);
Qsort(list, low+1,right);
}

分治法快排

标签:

原文地址:http://www.cnblogs.com/td15980891505/p/4451614.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!