1. 程式人生 > >幾種常用排序算法 (一)

幾種常用排序算法 (一)

實現 void 交換 完成 快速 並排 元素 [] log

八大常用排序算法詳細分析 包括復雜度:

技術分享圖片

排序有可以分為以下幾類:

(1)、交換排序:冒泡排序、快速排序

(2)、選擇排序:直接選擇排序、堆排序

(3)、插入排序:直接插入排序、希爾排序

(4)、歸並排序

(5)、基數排序(桶排序)


1.冒泡排序

顧名思義,冒泡排序就是用氣泡從下往上冒的原理,將氣泡(較小或較大的數)依次往前移。

具體做法(升序):設總共有N個元素,則至少需要進行N-1次冒泡。一次排序排序中,若前一個元素大於後一個元素,則交換兩個元素,然後在依次判 斷後面兩兩相鄰元素大小並進行交換。進行完N-1輪冒泡後,排序完成。

C++算法實現:

void Bubble_Sort(int
a[],int len) { int temp; //臨時變量定義在循環之外,減少重復的定義 釋放 ,提高效率 for (int i = 0; i < len-1 ; ++i) { for (int j = 0; j < len - i - 1; ++j) { if (a[j]>a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } }

冒泡排序優化:

若某一次排序中沒有數據進行交換,則排序完成,直接停止排序。所以代碼可以優化。

void Select_Sort(int a[], int len)
{
    int temp;
    bool flag = true;
    while (flag)
    {
        flag = false;
        for (int i = 0; i < len - 1; ++i)
        for (int j = i + 1; j < len; ++j)
        if (a[i]>a[j])
        {
            temp 
= a[i]; a[i] = a[j]; a[j] = temp; flag =false; } } }


2.直接選擇排序

直接選擇排序的原理比較簡單,就是每一次從數列中選擇一個最大(或最小)的元素,將其依次放入數組。

具體做法:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較為止。

C++算法實現:

void Select_Sort(int a[], int len)
{
    int temp;
    for (int i = 0; i < len - 1; ++i)
        for (int j = i + 1; j < len; ++j)
            if (a[i]>a[j])
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
}


3.直接插入排序

直接插入排序的基本思想是:從第二個元素開始,每一步把前面的元素排成一個有序的數列,然後把這個元素有序地插入到前面有序的數列中,直到全部數據插入完畢為止。

假設有一組N個元素無序序列

(1) 將這個序列的第一個元素視為一個有序序列;
(2) 依次把第2個到第N個元素, 插入到這個有序序列中;

C++算法實現:

void Insert_Sort(int a[],int len)
{
    int temp;
    for (int i = 1; i < len; ++i)
    for (int j = i; j >= 0; --j)
    {
        if (a[j] >= a[j - 1])
            break;
        else
        {
            temp = a[j];
            a[j] = a[j - 1];
            a[j - 1] = temp;
        }
    }
}

上面這種插入排序還可以進行優化,上面的方法需要通過中間變量進行很多次的交換,我們可以先找到待插入元素應該插入的位置後,將該位置後的元素依次後移,在將待插入元素插入它應該在的位置上,這樣就能減少很多的額外交換操作。

直接插入算法優化:

void Insert_Sort(int a[],int len)
{
    //插入排序優化:
    int temp;
    int j;
    for (int i = 1; i < len;++i)
    {
        temp = a[i];
        for (j = i; j >= 1 && temp < a[j - 1]; --j)
            a[j] = a[j - 1];
        a[j] = temp;
    }
}


4.希爾排序

希爾排序是一種插入排序算法,又稱作縮小增量排序。是對直接插入排序算法的改進。

其基本思想是:先取一個小於n的整數作為第一個增量,把全部數據分成個組。所有距離為的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;然後,取第二個增量重復上述的分組和排序,直至所取的增量,即所有記錄放在同一組中進行直接插入排序為止。該方法實質上是一種分組插入方法。

C++算法實現:

void Shell_Sort(int a[], int len)
{
    int d = len >> 1;  //右移運算符比除法快
    int temp;
    int i,j,k;
    while (d!=0)
    {
        for (i = 0; i < d; ++i)  //分成d組 分別排序  2個數一組  在4個數一組 ... 最後合成一組
        {
            for (j = i + d; j < len; j += d)  //對第i組排序
            {
                temp = a[j];
                for (k = j; k >= i+ d &&temp < a[k - d]; k-=d)
                {
                    a[k] = a[k - d];
                }
                a[k] = temp;
            }
        }
        d /= 2;//將每組兩兩合並,再進行排序
    }
}

幾種常用排序算法 (一)