快速排序
来源:互联网 发布:jc视频破解软件 编辑:程序博客网 时间:2024/05/05 15:46
思想
快速排序采用的思想是分治思想。
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
举例说明一下吧,这个可能不是太好理解。假设要排序的序列为
2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移
2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置
2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面
2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变
经过第一轮的快速排序,元素变为下面的样子
[1] 2 [4 9 3 6 7 5]
之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。
public static void q1Sort(int[]a,int left,int right)
{
int high = right;
int low = left;
int key =a[left];
if(left<right)
{
while(low<high)
{
while(low<high&&a[high]>key)high--;
while(low<high&&a[low]<key)low++;
if(low<high)
{
int tmp = a[low];
a[low]=a[high];
a[high]=tmp;
}
}
Test.q1Sort(a, left, low-1);
Test.q1Sort(a, low+1,right);
}
}
C++
int quicksort(vector<int> &v, int left, int right){
if(left < right){
int key = v[left];
int low = left;
int high = right;
while(low < high){
while(low < high && v[high] > key){
high--;
}
v[low] = v[high];
while(low < high && v[low] < key){
low++;
}
v[high] = v[low];
}
v[low] = key;
quicksort(v,left,low-1);
quicksort(v,low+1,right);
}
}
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 使用JMeter做压力测试
- 蓝牙协议简述 && Linux下Bluez
- ORA-01678: parameter log_file_name_convert...
- 关于System.Convert.ToInt32(“0.00000000001112”);提示:输入字符串的格式不正确
- struts2 actionError 前台页面显示乱码
- 快速排序
- 蓝牙协议栈
- Android—TextView的XML属性和方法
- 手机开机后直接进入程序界面,跳过锁屏界面
- Extjs 3.0 动态下拉框加入静态值
- 实战Linux Bluetooth编程 Class of Device(转)
- 简单验证码识别
- 远程桌面清理历史记录
- 黑马程序员_IO流(下)