快速排序算法的實(shí)現(xiàn)

快排圖示.jpg

快速排序之所比較快,因?yàn)橄啾让芭菖判?,每次排序的時(shí)候設(shè)置一個(gè)基準(zhǔn)點(diǎn),將小于等于基準(zhǔn)點(diǎn)的數(shù)全部放到基準(zhǔn)點(diǎn)的左邊,將大于等于基準(zhǔn)點(diǎn)的數(shù)全部放到基準(zhǔn)點(diǎn)的右邊。這樣在每次交換的時(shí)候就不會(huì)像冒泡排序一樣每次只能在相鄰的數(shù)之間進(jìn)行交換,交換的距離就大的多了。因此總的比較和交換次數(shù)就少了,速度自然就提高了。當(dāng)然在最壞的情況下,仍可能是相鄰的兩個(gè)數(shù)進(jìn)行了交換。

快速排序的最差時(shí)間復(fù)雜度和冒泡排序是一樣的都是O(N2),
平均時(shí)間復(fù)雜度為O(NlogN)。
快速排序是基于“二分”的思想。

C語(yǔ)言代碼實(shí)現(xiàn)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MaxLen 10

void printArray(int arr[],int length)
{
    for (int i = 0; i<length; i++) {
        printf(" %d",arr[i]);
    }
    printf("\n");
}

void quickSort(int arr[],int left,int right)
{
    static int count;
    int i,j,temp;

   
    if (left<right)
    {

        i = left;
        j = right;
        temp = arr[i];
        count ++;
        printf("\n第%d輪,left=%d,right=%d,temp=%d\n",count,left,right,temp);
        
        while (i<j)
        {
            while (i<j&&arr[j]>temp)
            {
                j--;
            }
            
            if (i<j)
            {
                arr[i] = arr[j];
                i++;
            }
            printArray(arr, MaxLen);
            while (i<j&&arr[i]<temp)
            {
                i++;
            }
            
            if (i<j)
            {
                arr[j] = arr[i];
            }
            printArray(arr, MaxLen);
        }
        
        arr[i] = temp;
        printArray(arr, MaxLen);
        quickSort(arr, left, i-1);
        quickSort(arr, i+1, right);
    }
    else
    {
        return;
    }
}



int main(int argc, const char * argv[]) {
    
    int arr[MaxLen] ;
    srand( (unsigned)time( NULL ) );
    
    for (int i = 0; i<MaxLen; i++)
    {
        arr[i] = rand()%50+1;
    }
    printf("原始數(shù)組:\n");
    printArray(arr, MaxLen);

    quickSort(arr, 0, MaxLen-1);
    printf("快排后數(shù)組:\n");
    printArray(arr, MaxLen);
    return 0;
}

運(yùn)行結(jié)果

原始數(shù)組:
 46 3 11 39 37 24 24 11 13 20

第1輪,left=0,right=9,temp=46
 20 3 11 39 37 24 24 11 13 20
 20 3 11 39 37 24 24 11 13 20
 20 3 11 39 37 24 24 11 13 46

第2輪,left=0,right=8,temp=20
 13 3 11 39 37 24 24 11 13 46
 13 3 11 39 37 24 24 11 39 46
 13 3 11 11 37 24 24 11 39 46
 13 3 11 11 37 24 24 37 39 46
 13 3 11 11 37 24 24 37 39 46
 13 3 11 11 37 24 24 37 39 46
 13 3 11 11 20 24 24 37 39 46

第3輪,left=0,right=3,temp=13
 11 3 11 11 20 24 24 37 39 46
 11 3 11 11 20 24 24 37 39 46
 11 3 11 13 20 24 24 37 39 46

第4輪,left=0,right=2,temp=11
 11 3 11 13 20 24 24 37 39 46
 11 3 11 13 20 24 24 37 39 46
 11 3 11 13 20 24 24 37 39 46

第5輪,left=0,right=1,temp=11
 3 3 11 13 20 24 24 37 39 46
 3 3 11 13 20 24 24 37 39 46
 3 11 11 13 20 24 24 37 39 46

第6輪,left=5,right=8,temp=24
 3 11 11 13 20 24 24 37 39 46
 3 11 11 13 20 24 24 37 39 46
 3 11 11 13 20 24 24 37 39 46

第7輪,left=7,right=8,temp=37
 3 11 11 13 20 24 24 37 39 46
 3 11 11 13 20 24 24 37 39 46
 3 11 11 13 20 24 24 37 39 46
快排后數(shù)組:
 3 11 11 13 20 24 24 37 39 46
Program ended with exit code: 0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 該系列文章主要是記錄下自己暑假這段時(shí)間的學(xué)習(xí)筆記,暑期也在實(shí)習(xí),抽空學(xué)了很多,每個(gè)方面的知識(shí)我都會(huì)另起一篇博客去記...
    Yanci516閱讀 12,634評(píng)論 6 19
  • 我一直覺(jué)得寫(xiě)代碼也可以寫(xiě)出藝術(shù),在不懂畫(huà)的人的眼里,《向日葵》不過(guò)是小孩子的涂鴉,在懂代碼的人眼里,那看似混亂的字...
    AidenRao閱讀 4,248評(píng)論 9 59
  • 心是我的 但里面裝滿的 全是你
    小二拿酒來(lái)閱讀 52評(píng)論 0 0
  • 《產(chǎn)品心經(jīng)》讀書(shū)筆記: 第七件事:產(chǎn)品的五個(gè)要素 內(nèi)涵為用戶提供的基本效用或利益,滿足用戶的本質(zhì)需求 形式實(shí)現(xiàn)產(chǎn)品...
    KurokoZ閱讀 308評(píng)論 0 1
  • 第一次買了一個(gè)豆?jié){機(jī),打出了人生的第一杯豆?jié){,滿意感足足的
    蘇sunshineabc閱讀 111評(píng)論 0 0

友情鏈接更多精彩內(nèi)容