您的位置:首页 > 编程语言 > C语言/C++

快速排序算法学习及C++代码实现

2018-03-16 17:06 381 查看

快速排序

基本思想

一种基于分治策略的排序算法,空间复杂度O(1),时间复杂度O(n log n)
1) 先选择出一个轴值,记为mid_point。这里我们就选择数组的最左边的值。
2) 分区,将大于mid_point的k个值放在右边区间,将小于mid_point的值放在左边区间
3) 分别对左右区间进行一二步的操作

实例

有如下的数组要用快速排序算法排序。a[10]={5,8,1,3,7,9,0,2,4,10};
第一步,取数组最左边的值作为轴值
第二步,i=0,j=9,从数组最右边a[9]开始找到第一个比5小的值,将其填到5的位置a[0]。
      我们发现a[8]满足条件。
此时数组a[10]={4,8,1,3,7,9,0,2,4,10}
第三步,从i=1开始往右找到第一个比5大的值,将其填到a[8]的位置。我们发现a[1]=8满足
   此时数组a[10]={4,8,1,3,7,9,0,2,8,10}
第四步,从i=7开始往左找到比5小的值,将其填到a[1]的位置。我们看到a[7]满足
此时数组a[10]={4,2,1,3,7,9,0,2,8,10}
第五步,从i=2开始往右找到比5大的值a[4]将其填到a[7]的位置
此时数组a[10]={4,2,1,3,7,9,0,7,8,10}
第六步,从i=6开始往左找到比5小的值a[6]将其填到a[4]的位置
数组a[10]={4,2,1,3,0,9,0,7,8,10}
第七步,从i=5开始往右找到比五大的a[5]填到a[6]的位置
数组a[10]={4,2,1,3,0,9,9,7,8,10}
第八步,将五填到a[5]的位置
a[10]={4,2,1,3,0,5,9,7,8,10}
第九步,对数组的左右两部分分别进行上面的步骤

实现代码

#include<iostream>
#include<vector>
#include<algorithm>
#include<conio.h>
using namespace std;
void QuickSort(vector<int>&m_vec, int l, int r);
int main()
{
vector<int>m_vec = { 5,8,1,3,7,9,0,2,4,10 };
QuickSort(m_vec, 0, m_vec.size() - 1);
for (auto beg=m_vec.cbegin();beg!=m_vec.cend();beg++)
{
cout << *beg << "  ";
}
_getch();
return 0;
}
void QuickSort(vector<int>&m_vec, int l, int r)
{
if (l >= r)
{
return;
}
int i = l;
int j = r;
int m_mid = m_vec[i];//保存轴值
while (i<j)
{
while (i<j&&m_vec[j]>m_mid)//从右往左找到小于轴值得位置
{
j--;
}
if (i<j)
{
m_vec[i++] = m_vec[j];//填坑
}
​
while (i<j&&m_vec[i]<m_mid)//从左往右找到大于轴值得位置
{
i++;
}
if (i<j)
{
m_vec[j--] = m_vec[i];//填坑
}
}
m_vec[i] = m_mid;//将轴值填到中间
QuickSort(m_vec, l, i-1);//递归处理左半边数组
QuickSort(m_vec, i + 1, r);//递归处理右半边数组
}
​
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: