快速排序

已經很久沒有發表博文了,人生中有很多噼裏啪啦的事情讓我們在這個世界中過得坎坎坷坷,跌宕起伏,就和力哥說的一樣用平常心去看待吧,這也算的上一個自我安慰吧,加油,相信自己永遠是最棒的!

快速排序

大致思想:
首先是運用了分治的思想,同時不同與分治排序一樣,這個算法的思想主要是在一段無序數組中選取一個數字作爲一箇中間值,然後將這個數組中的數字以這個中間值爲基準各自分往數組的兩邊。
代碼:

/*************************************************************************
    > File Name: 1076.c
    > Author: 
    > Mail: 
    > Created Time: 2015年06月18日 星期四 20時51分31秒
 ************************************************************************/

//快速排序
//輸入n個數,進行排序
//輸入:
//5
//5 4 3 2 1
//輸出:
//1 2 3 4 5
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int i,j,k,n,a[100002];
int partition(int low,int high)
{
    //這個a[0]就是用來這段數組中
    //設定的中間值,往往我們用這
    //段數組中的第一個值,當然如
    //果爲了避免出現最壞的情況出
    //現,我們可以有 low-high 的
    //隨機位置作爲設定的中間值。
    a[0]=a[low];
    //這段代碼需要自己動手模擬一
    //遍,意思就是上面我已經述說
    //了一遍了,代碼自己手動模擬
    //一個即可明白。
    //注意:a[0]是假設的中間值。
    while(low<high){
        while(a[high]>a[0]&&low<high)high--;
        if(low<high)a[low++]=a[high];
        while(a[low]<a[0]&&low<high)low++;
        if(low<high)a[high++]=a[low];
    }
    a[low]=a[0];
    return low;
}
void init()
{
    memset(a,0,sizeof(a));
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
}
void my_Quicksort(int low,int high)
{
    //首先利用分而治之的思想將一段數組截
    //成兩節
    if(low<high)
    {
        int mid = partition(low,high);//進入一次快排處理
        my_Quicksort(low,mid-1);
        my_Quicksort(mid+1,high);
    }
}
void print()
{
    for(i=1;i<=n;i++)
    {
        printf("%d ",a[i]);
    }
}
int main()
{
    init();
    my_Quicksort(1,n);
    print();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章