前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【模板小程序】快速排序算法实现(递归+非递归)

【模板小程序】快速排序算法实现(递归+非递归)

作者头像
xiaoxi666
发布2018-10-29 17:12:18
2K0
发布2018-10-29 17:12:18
举报
文章被收录于专栏:xiaoxi666的专栏xiaoxi666的专栏

快速排序一定要会默写!

递归版
代码语言:javascript
复制
 1 /*
 2 本程序说明:
 3 
 4 递归方法参见《大话数据结构》
 5 
 6 */
 7 #include <iostream>
 8 #include <vector>
 9 using namespace std;
10 
11 
12 void print(const vector<int>& array)
13 {
14     for(auto val:array)
15         cout<<val<<" ";
16     cout<<endl;
17 }
18 
19 /*********************快速排序的划分写法1**********************/
20 int partition1(vector<int>& array,int low, int high)
21 {
22     int pivot_value=array[low];//取当前区段第一个元素为枢轴
23     while(low < high)
24     {
25         while(low<high && array[high]>=pivot_value)
26             --high;
27         swap(array[low],array[high]);
28         while(low<high && array[low]<=pivot_value)
29             ++low;
30         swap(array[low],array[high]);
31     }
32     return low;
33 }
34 /*************************************************************/
35 /**********快速排序的划分写法2:优化了不必要的交换***************/
36 int partition2(vector<int> &array, int low, int high)
37 {    
38     int pivot_value = array[low];//备份枢轴值
39     while(low < high){
40         while(low < high && array[high] >= pivot_value){
41             --high;
42         }
43         array[low] = array[high];
44         while(low < high && array[low] <= pivot_value){
45             ++low;
46         }
47         array[high] = array[low];
48     }
49     array[low] = pivot_value;
50     
51     return low;
52 }
53 /*************************************************************/
54 
55 /************************常规递归方法*************************/
56 void _qsort(vector<int>& array,int low, int high)
57 {
58     int pivot_index;
59     if(low < high)
60     {
61         pivot_index=partition2(array,low,high);
62         _qsort(array,low,pivot_index-1);
63         _qsort(array,pivot_index+1,high);
64     }
65 }
66 /*************************************************************/
67 /*************************尾递归方法**************************/
68 void _qsort_tail(vector<int>& array,int low, int high)
69 {
70     int pivot_index;
71     while(low < high)
72     {
73         pivot_index=partition2(array,low,high);
74         _qsort_tail(array,low,pivot_index-1);
75         low=pivot_index+1;//这里改成while,下一步partition2相当于_qsort_tail(array,pivot_index+1,high);
76     }
77 }
78 /*************************************************************/
79 
80 //递归排序入口函数
81 void qsort(vector<int>& array)
82 {
83     if(array.empty())
84         return;
85     //_qsort(array,0,array.size()-1);
86     _qsort_tail(array,0,array.size()-1);
87 }
88 
89 int main()
90 {
91     vector<int> array{5,2,7,1,8,-3,4,9,-7,0,88,999,-876,34567,-9876543};
92     cout<<"before_qsort: ";print(array);
93     qsort(array);
94     cout<<"after_qsort: ";print(array);
95     return 0;
96 }

参考链接:http://www.cnblogs.com/cj723/archive/2011/04/27/2029993.html

非递归版
代码语言:javascript
复制
 1 /*
 2 本程序说明:
 3 
 4 非递归方法利用了栈
 5 
 6 */
 7 #include <iostream>
 8 #include <vector>
 9 #include <stack>
10 using namespace std;
11 
12 
13 void print(const vector<int>& array)
14 {
15     for(auto val:array)
16         cout<<val<<" ";
17     cout<<endl;
18 }
19 
20 /*********************快速排序的划分写法1**********************/
21 int partition1(vector<int>& array,int low, int high)
22 {
23     int pivot_value=array[low];//取当前区段第一个元素为枢轴
24     while(low < high)
25     {
26         while(low<high && array[high]>=pivot_value)
27             --high;
28         swap(array[low],array[high]);
29         while(low<high && array[low]<=pivot_value)
30             ++low;
31         swap(array[low],array[high]);
32     }
33     return low;
34 }
35 /*************************************************************/
36 /**********快速排序的划分写法2:优化了不必要的交换***************/
37 int partition2(vector<int>& array, int low, int high)
38 { 
39     int pivot_value = array[low];//备份枢轴值
40     while(low < high){
41         while(low < high && array[high] >= pivot_value){
42             --high;
43         }
44         array[low] = array[high];
45         while(low < high && array[low] <= pivot_value){
46             ++low;
47         }
48         array[high] = array[low];
49     }
50     array[low] = pivot_value;
51     
52     return low;
53 }
54 /*************************************************************/
55 //辅助函数
56 void _qsort_norec(vector<int>& array,int low, int high)
57 {
58     stack<int> temp;
59     temp.push(high);
60     temp.push(low);
61     while(!temp.empty())
62     {
63         low=temp.top();temp.pop();
64         high=temp.top();temp.pop();
65         
66         if(low<high)
67         {
68             int pivot_index=partition2(array,low,high);
69             if(pivot_index>low)
70             {
71                 temp.push(pivot_index-1);
72                 temp.push(low);
73             }
74             if(high>pivot_index)
75             {
76                 temp.push(high);
77                 temp.push(pivot_index+1);
78             }
79         }
80     }
81 }
82 //非递归排序入口函数
83 void qsort_norec(vector<int>& array)
84 {
85     if(array.empty())
86         return;
87     _qsort_norec(array,0,array.size()-1);
88 }
89 
90 int main()
91 {
92     vector<int> array{5,2,7,1,8,-3,4,9,-7,0,88,999,-876,34567,-9876543};
93     cout<<"before_qsort: ";print(array);
94     qsort_norec(array);
95     cout<<"after_qsort: ";print(array);
96     return 0;
97 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-08-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 快速排序一定要会默写!
    • 递归版
      • 非递归版
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档