算法Training——排序

分類

排序算法主要分爲兩大類java

  1. 比較排序,主要有:冒泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等
  2. 非比較排序,主要有:計數排序,基數排序,桶排序等

穩定性

排序算法的穩定性定義:
若是序列中有a=b,排序前a在b以前,排序後a還在b以前,則稱這種排序算法是穩定的。算法

  • 對於不穩定的排序算法,只須要舉出實例,就能證實其不穩定性。而對穩定排序算法,必須對算法進行分析才能判斷其是否穩定
  • 排序算法是否穩定是由具體算法決定的,穩定算法也能夠在某種條件下變爲不穩定算法。例如冒泡排序中,把交換兩數的條件變爲A[i]>=A[i+1](本來是>號)
上例告訴咱們,算法是由具體的人來寫的,寫的垃圾,穩定算法也能寫的不穩定

常見排序算法性能表

timg?image&quality=80&size=b9999_10000&sec=1526617446884&di=ade501eee4def9e851ac33c0d2dc3fb5&imgtype=0&src=http%3A%2F%2Fimages.cnblogs.com%2Fcnblogs_com%2Fpangxiaodong%2FCPlusPlus%2F%25E6%258E%2592%25E5%25BA%258F-%25E5%25A4%258D%25E6%259D%2582%25E5%25BA%25A6-%25E7%25A8%25B3%25E5%25AE%259A%25E6%2580%25A7.png

具體排序算法分析和實例

1. 冒泡排序

介紹

重複地走訪過要排序的元素,依次比較相鄰兩個元素,若是他們的順序錯誤就把他們調換過來,直到沒有元素再須要交換,排序完成。這個算法的名字由來是由於越小(或越大)的元素會經由交換慢慢「浮」到數列的頂端。數組

步驟

  1. 比較相鄰的元素,若是前一個比後一個大,就把它們兩個調換位置
  2. 對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。這步作完後,最後的元素會是最大的數
  3. 針對全部的元素重複以上的步驟,除了已經排序完成的數

timg?image&quality=80&size=b9999_10000&sec=1526616025686&di=c7dc0f625830440849bf24680e0a287c&imgtype=0&src=http%3A%2F%2Fs2.51cto.com%2Foss%2F201711%2F22%2Fd0fed6463534a37d70f8a3f0466f28a3.gif

實例

1. 描述

給一組整數,按照升序排序,使用選擇排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法性能

2. 樣例

對於數組 [3, 2, 1, 4, 5], 排序後爲:[1, 2, 3, 4, 5]spa

3. 分析

無需分析3d

4. 解答

fun sortInteger(a : IntArray)
{
    val len = a.size - 1
    var alreadyNum =  0
    var sortFinish = false

    while (alreadyNum <= len - 1 && !sortFinish)
    {
        var perSortFinish = true

        for (i in 1..(len - alreadyNum))
        {
            if (a[i-1] > a[i])
            {
                val temp = a[i-1]
                a[i-1] = a[i]
                a[i] = temp
                perSortFinish = false
            }
        }

        sortFinish = perSortFinish
        alreadyNum += 1
    }
}
public void sortIntegers(int[] A) {
    int len = A.length - 1;
    int alreadyNum = 0;
    boolean sortFinish = false;

    while (alreadyNum <= len - 1 && !sortFinish)
    {
        boolean perSortFinish = true;

        for (int i=1; i <= len-alreadyNum; i++)
        {
            if (A[i-1] > A[i])
            {
                int temp = A[i-1];
                A[i-1] = A[i];
                A[i] = temp;
                perSortFinish = false;
            }
        }

        sortFinish = perSortFinish;
        alreadyNum += 1;
    }
}

2. 快速排序

介紹

經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。code

步驟

  1. 先從數列中取出一個數(爲方便一般會選第一個數)做爲基準數
  2. 逐個比較,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊
  3. 再對左右區間重複第二步,直到各區間只有一個數

timg?image&quality=80&size=b9999_10000&sec=1527491320&di=5cbbe58e46daa352d74bf76b10a92475&imgtype=jpg&er=1&src=http%3A%2F%2Fimage20.it168.com%2F201210_500x375%2F1224%2F1488eb7150d1afb7.png

實例

直接沿用上一題的實例,爲便於閱讀,將該例子再寫一遍blog

1. 描述

給一組整數,按照升序排序,使用選擇排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法排序

2. 樣例

對於數組 [3, 2, 1, 4, 5], 排序後爲:[1, 2, 3, 4, 5]遞歸

3. 分析

無需分析

4. 解答

相關文章
相關標籤/搜索