码迷,mamicode.com
首页 > 编程语言 > 详细

十大算法系列之(一)快速排序

时间:2016-07-07 09:46:38      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

&1 思想和时间复杂度

  • 分治法思想(Divide and Conquer),这是算法导论里面讲的第一个算法思想,很经典也很实用。
  • 时间复杂度分析,最好是O(n),最差是O(n2),平均性能是O(nlog(n))。

 

&2 算法

  #1. 在待排数列中(n个数)选择一个基准数(理论上可以任意);

  #2. 剩下的 n-1 个数与基准数对比,比基准数小的放左边,反之在右边;(也有人称为划分操作)

  #3. 一轮循环结束,此时基准数是位于它的最终位置;

  #4. 重复步骤#1~#3,直到最后一个基准数左边和右边的元素个数为0或1,则排序完成。

 

&3 举例

技术分享

 

&4 c++程序实现

#include<iostream>
#include<vector>

using namespace std;

void QuickSort(vector<int > &A, int p, int q);
int Partition(vector<int> &a, int p, int q);
void swapv(int &a, int &b);

int main(){
  vector<int> seti = { 13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11 };
  int len = seti.size();
  QuickSort(seti,0,len-1);

  cout << "The sorted array is: \n";
  for (vector<int>::iterator iter = seti.begin(); iter != seti.end(); iter++)
  cout << *iter << "\t";
  cout << endl;

  system("Pause");
  return 0;
}

void QuickSort(vector<int > &A,int p,int q){
  if (p < q){
    int pos = Partition(A, p, q);
    QuickSort(A, p, pos - 1);
    QuickSort(A, pos + 1, q);
  }
}

int Partition(vector<int> &a,int p, int q){
  int val = a[p];
  int j = q + 1;
  for (int i = q; i > p-1; i--){
    if (a[i]>val){
      j = j - 1;
      if (i != j)
        swapv(a[j],a[i]);
    }
  }

  if (p != j - 1)
    swapv(a[p],a[j-1]);

  return j - 1;
}

void swapv(int &a,int &b){
  a = a + b;
  b = a - b;
  a = a - b;
}

 

&5 程序实现结果截图

技术分享

如果对代码优化,亲有更好的想法,咱可以一起学习讨论哦!

十大算法系列之(一)快速排序

标签:

原文地址:http://www.cnblogs.com/sophia-hxw/p/5357824.html

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