方法一:
<pre code_snippet_id="1828553" snippet_file_name="blog_20160813_1_7365625" name="code" class="cpp">/****************************
*@time 2016/08/12 21:58
*@author dzq
*@description 快速排序(分治、挖坑)
************************************/
#include<cstdio>
#include<iostream>
using namespace std;
void quick_sort(int ori_Nums[],int start_Index,int end_Index)
{
if(start_Index>=end_Index) return;
int smaller_Num_Index=end_Index;
int bigger_Num_Index=start_Index;
int flag=ori_Nums[start_Index];
while(smaller_Num_Index>bigger_Num_Index)
{
while(smaller_Num_Index>bigger_Num_Index&&ori_Nums[smaller_Num_Index]>=flag) smaller_Num_Index--;//從後往前找比flag小的數字
while(smaller_Num_Index>bigger_Num_Index&&ori_Nums[bigger_Num_Index]<=flag) bigger_Num_Index++;//從前往後找比flag大的數
//*此處會出現三種情況:
// *1、比flag大的數和比flag小的數都找到了,交換
// *2、都沒有找到,那麼smaller_Num_Index最終會等於0
// *3、只找到了比flag小的數
if(smaller_Num_Index>bigger_Num_Index)
{
int tmp=ori_Nums[smaller_Num_Index];
ori_Nums[smaller_Num_Index]=ori_Nums[bigger_Num_Index];
ori_Nums[bigger_Num_Index]=tmp;
}
}
//*如是第一種情況,最終要講flag放置在smaller_Num_Index=bigger_Num_Index的地方,同時將這個地方的數放置在flag的地方
// *如是第二種情況,兩句都可沒有
//*如是第三種情況,只用在這裏可以交換較小的數與flag
ori_Nums[0]= ori_Nums[smaller_Num_Index];
ori_Nums[smaller_Num_Index]=flag;//放置flag
quick_sort(ori_Nums,0,smaller_Num_Index);//將flag左側分治排序(包括flag)
quick_sort(ori_Nums+smaller_Num_Index+1,0,end_Index-smaller_Num_Index-1);//將flag右側分治排序
}
int main()
{
int ori_Nums[]={3,2,1,4,4};
quick_sort(ori_Nums,0,4);
for(int i=0;i<5;i++)
{
printf("%d",ori_Nums[i]);
}
}
算法分析:
1、smaller_Num_Index>bigger_Num_Index&&ori_Nums[smaller_Num_Index]>=flag
如果數組中的數全部相當,若將等於號去掉,則會無限遞歸下去
有了等號,smaller_Num_Index最終將會爲0,遞歸時quick_sort(ori_Nums,0,smaller_Num_Index)中smaller_Num_Index=0, quick_sort(ori_Nums+smaller_Num_Index+1,0,end_Index-smaller_Num_Index-1);ori_Nums+smaller_Num_Index+1最終數組的長度會變爲0.
方法二:
/**************************************************************
*@time 2016/08/28 16:35
*@place DHU.13.5005
***************************************************************/
#include<cstdio>
void quick_sort(int *ori_Nums,int begin_Index,int end_Index)
{
if(end_Index-begin_Index<=0) return;
int lit=begin_Index;
int rit=end_Index;
int flag=ori_Nums[begin_Index];
while(lit<rit)
{
while(ori_Nums[rit]>=flag&&lit<rit) rit--;//從後往前找比flag小的數字
while(ori_Nums[lit]<=flag&&lit<rit) lit++;//從前往後找比flag大的數
if(lit<rit)//比flag大的數和小的數都找到了,則交換
{
int tmp=ori_Nums[rit];
ori_Nums[rit]=ori_Nums[lit];
ori_Nums[lit]=tmp;
}
//處理結束時必定爲以下兩個情景之一
else if(rit!=begin_Index)//只找到了比flag小的數,則交換flag與小的數
{
ori_Nums[begin_Index]=ori_Nums[rit];
ori_Nums[rit]=flag;
}
//都沒有找到,則證明已排好,不處理
}
quick_sort(ori_Nums,begin_Index,rit);//將flag左側分治排序(包括flag)
quick_sort(ori_Nums,rit+1,end_Index);//將flag右側分治排序
}
int main()
{
int ori_Nums[]={3,2,1,4,4};
myQsort(ori_Nums,0,5);
for(int i=0;i<5;i++)
{
printf("%d\n",ori_Nums[i]);
}
}