快速排序

方法一:
<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]);
    }
}



發佈了35 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章