10大排序算法之【快速排序】

我的信仰是自由,而快速排序淋漓尽致的体现了这点,加之我最喜欢的编程语言javascript内置的sort算法也是快排,所以毫无疑问,我最钟爱的排序算法就是快速排序了。
总的来说,快排可以分为两类,一类是交换快排,即从左边找到一个大于middle的数,在从右边找到一个小于等于middle的数,然后交换,递归继续。一类是赋值快排,即先将第一个数抽出来【我通常这么做】赋值给middle,在从右向左找到一个小于middle的直接赋值给i,然后从i开始从左向右找一个大于等于middle的数直接赋值给j,这样当i=j的时候把middle复制给list[i]就完成了,,,然后开始递归。。。。
下面的代码是赋值排序实现,有种飘逸灵动的感觉。。

include<iostream>

include<vector>

using namespace std;

class QuickSort{

private:
    int len;
    vector<int> list;
public:
    QuickSort(vector<int> _list, int _len);
    void quick_sort(int left, int right);
    void out();

};

QuickSort::QuickSort(vector<int> _list, int _len){

for(int i=0; i<_len; i++) list.push_back(_list[i]);
this->len = _len;

}
void QuickSort::quick_sort(int left, int right){

int i = left;
int j = right;
int middleNum = list[left];

while(i<j){
    
    while(i<j && list[j] >= middleNum) j--;
    
    if(i<j){
        list[i] = list[j];
    }
    
    while(i<j && list[i] < middleNum) i++;
    
    if(i<j){
        list[j] = list[i];  
    }

}

list[i] = middleNum; 

if(i!=left) quick_sort(left, i-1);
if(j!=right)quick_sort(i+1 , right);

}

void QuickSort::out(){

for (int i=0; i<len; i++) cout<<list[i]<<",";

}

int main(){

int array[23] = {6,4,3,2,6,67,34,546,74,45,75,2,456,7,2,34,246,56,4,3,54,4,7};
vector<int> list;
for(int i=0; i<23; i++) list.push_back(array[i]);
QuickSort mazhe(list, 23);
mazhe.quick_sort(0,22);
mazhe.out();

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,352评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,969评论 18 399
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 5,235评论 0 1
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 6,776评论 0 35
  • 眼睛是透明的,透过它,可以看到内心深处的世界,而知识是心灵的眼睛,眼睛的重要性不容置疑,我理想中的眼睛是这样...
    云影M阅读 1,618评论 0 2