常用排序算法

一、冒泡排序

1.算法介紹:

冒泡排序(Bubble Sort),又被稱爲氣泡排序或泡沫排序。

它是一種較簡單的排序算法。它會遍歷若干次要排序的數列,每次遍歷時,它都會從前往後依次的比較相鄰兩個數的大小;如果前者比後者大,則交換它們的位置。這樣,一次遍歷之後,最大的元素就在數列的末尾! 採用相同的方法再次遍歷時,第二大的元素就被排列在最大元素之前。重複此操作,直到整個數列都有序爲止!

2.算法圖解

3.算法實現
冒泡排序C實現一

void bubble_sort1(int a[], int n)
{
    int i,j;

    for (i=n-1; i>0; i--)
    {
        // 將a[0...i]中最大的數據放在末尾
        for (j=0; j<i; j++)
        {
            if (a[j] > a[j+1])
                swap(a[j], a[j+1]);
        }
    }
}

冒泡排序C實現二:

void bubble_sort2(int a[], int n)
{
    int i,j;
    int flag;                 // 標記

    for (i=n-1; i>0; i--)
    {
        flag = 0;            // 初始化標記爲0

        // 將a[0...i]中最大的數據放在末尾
        for (j=0; j<i; j++)
        {
            if (a[j] > a[j+1])
            {
                swap(a[j], a[j+1]);
                flag = 1;    // 若發生交換,則設標記爲1
            }
        }

        if (flag==0)
            break;            // 若沒發生交換,則說明數列已有序。
    }
}

二、快速排序

1.算法介紹:

快速排序(Quick Sort)使用分治法策略。

它的基本思想是:選擇一個基準數,通過一趟排序將要排序的數據分割成獨立的兩部分;其中一部分的所有數據都比另外一部分的所有數據都要小。然後,再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

快速排序流程:

  • 從數列中挑出一個基準值。
  • 將所有比基準值小的擺放在基準前面,所有比基準值大的擺在基準的後面(相同的數可以到任一邊);在這個分區退出之後,該基準就處於數列的中間位置。
  • 遞歸地把”基準值前面的子數列”和”基準值後面的子數列”進行排序。

2.算法圖解

3.算法實現

/*
 * 快速排序
 *
 * 參數說明:
 *     a -- 待排序的數組
 *     l -- 數組的左邊界(例如,從起始位置開始排序,則l=0)
 *     r -- 數組的右邊界(例如,排序截至到數組末尾,則r=a.length-1)
 */
void quick_sort(int a[], int l, int r)
{
    if (l < r)
    {
        int i,j,x;

        i = l;
        j = r;
        x = a[i];
        while (i < j)
        {
            while(i < j && a[j] > x)
                j--; // 從右向左找第一個小於x的數
            if(i < j)
                a[i++] = a[j];
            while(i < j && a[i] < x)
                i++; // 從左向右找第一個大於x的數
            if(i < j)
                a[j--] = a[i];
        }
        a[i] = x;
        quick_sort(a, l, i-1); /* 遞歸調用 */
        quick_sort(a, i+1, r); /* 遞歸調用 */
    }
}

三、選擇排序

1.算法介紹:

選擇排序(Selection sort)是一種簡單直觀的排序算法。

它的基本思想是:首先在未排序的數列中找到最小(or最大)元素,然後將其存放到數列的起始位置;接着,再從剩餘未排序的元素中繼續尋找最小(or最大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

2.算法圖解

3.算法實現

/*
 * 選擇排序
 *
 * 參數說明:
 *     a -- 待排序的數組
 *     n -- 數組的長度
 */
void select_sort(int a[], int n)
{
    int i;        // 有序區的末尾位置
    int j;        // 無序區的起始位置
    int min;    // 無序區中最小元素位置

    for(i=0; i<n; i++)
    {
        min=i;

        // 找出"a[i+1] ... a[n]"之間的最小元素,並賦值給min。
        for(j=i+1; j<n; j++)
        {
            if(a[j] < a[min])
                min=j;
        }

        // 若min!=i,則交換 a[i] 和 a[min]。
        // 交換之後,保證了a[0] ... a[i] 之間的元素是有序的。
        if(min != i)
            swap(a[i], a[min]);
    }
}

四、直接插入排序

1.算法介紹:

直接插入排序(Straight Insertion Sort)的基本思想是:把n個待排序的元素看成爲一個有序表和一個無序表。開始時有序表中只包含1個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第一個元素,將它插入到有序表中的適當位置,使之成爲新的有序表,重複n-1次可完成排序過程。

2.算法圖解

3.算法實現

/*
 * 直接插入排序
 *
 * 參數說明:
 *     a -- 待排序的數組
 *     n -- 數組的長度
 */
void insert_sort(int a[], int n)
{
    int i, j, k;

    for (i = 1; i < n; i++)
    {
        //爲a[i]在前面的a[0...i-1]有序區間中找一個合適的位置
        for (j = i - 1; j >= 0; j--)
            if (a[j] < a[i])
                break;

        //如找到了一個合適的位置
        if (j != i - 1)
        {
            //將比a[i]大的數據向後移
            int temp = a[i];
            for (k = i - 1; k > j; k--)
                a[k + 1] = a[k];
            //將a[i]放到正確位置上
            a[k + 1] = temp;
        }
    }
}

注:更多算法請看這裏——數據結構與算法系列 目錄,以上算法皆來至於這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章