算法學習之快速排序的C語言實現


近幾天在學習簡單算法,今天看了一個快速排序和堆排序,堆排序還沒搞懂,還是先把快速排序搞清楚吧

教程網上一艘一大堆,這里選擇一個講的比較通俗的的一個吧:

http://blog.csdn.net/morewindows/article/details/6684558   感謝博主。

四種排序算法的比較

冒泡排序是最慢的排序算法。在實際運用中它是效率最低的算法。它通過一趟又一趟地比較數組中的每一個元素,使較大的數據下沉,較小的數據上升。

插入排序通過將序列中的值插入一個已經排好序的序列中,直到該序列結束。插入排序是對冒泡排序的改進。它比冒泡排序快兩倍。一般不用在數據的值大於 1000 的場合,或數據的個數超過 200 的序列。

選擇排序在實際應用中處於與冒泡排序基本相同的地位。它們只是排序算法發展的初級階段,在實際中使用較少。但是它們最好理解。

快速排序是大規模遞歸的算法,它比大部分排序算法都要快。一般用於數據個數比較多的情況。盡管可以在某些特殊的情況下寫出比快速排序快的算法,但是就通常情況而言,沒有比它更快的了。快速排序是遞歸的,對於內存非常有限的機器來說,它不是一個好的選擇。


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

/*
快速排序算法學習
*/

void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void quickSort(int arr[] ,int start, int end)
{
    int arrBase, arrMiddle;

    int tempStart = start,
        tempEnd = end;

    //對於這種遞歸的函數,內部必須要有一個函數返回的條件
    if(tempStart >= tempEnd)
        return;

    //拷貝一個基准值作為后面比較的參數
    arrBase = arr[start];
    while(start < end)
    {
        while(start < end && arr[end] > arrBase)
            end--;
        if(start < end)
        {
            swap(&arr[start], &arr[end]);
            start++;
        }

        while(start < end && arr[start] < arrBase)
            start++;
        if(start < end)
        {
            swap(&arr[start], &arr[end]);
            end--;
        }
    }
    arr[start] = arrBase;
    arrMiddle = start;

    //分治方法進行遞歸
    quickSort(arr,tempStart,arrMiddle-1);
    quickSort(arr,arrMiddle+1,tempEnd);
}

int main()
{
    int myArr[] = {12,13,15,20,0,-1,-10,100};

    int arrLength = sizeof(myArr)/sizeof(int);
    quickSort(myArr,0,arrLength-1);

    for(int i = 0; i<arrLength; i++)
        printf("%5d",myArr[i]);
    return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM