數組排序算法

  前幾天瀏覽網頁,看到過一個帖子,問:html

  有哪些算法驚豔到了你?

  下面有100多的回答,瀏覽了一些,有的是根本沒聽過,涉及到了多個領域的優秀算法,其中有一個回答是快排,並且還有很生動的動圖演示。java

  後來作算法題時,就遇到了數組排序的問題,再去那網頁找那個快排時,就沒再看到那個動圖TOT,多是太多回答我沒找太細,這裏留一下網址:https://www.zhihu.com/question/26934313算法

  沒找到後悔不已啊,只能本身百度去找相關詳細的介紹了。數組

  下面記錄一下數組排序的幾種方法:dom

一、最簡單方便使用的就是 Arrays 自帶的 Arrays.sort(array);這裏不過多描述。學習

import java.util.Arrays;

public class SortTest {
    public static void main (String[] args) {
        int[] arr = new int[10];
        for(int i = 0; i < arr.length; i ++) {
            arr[i] = (int)(Math.random()*100);
        }
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

 

二、冒泡排序ui

  這個想必你們學語言的都學習過,當初腦子笨,邏輯很差,還記了很久纔讀懂原理,還好如今回想起來仍是很簡單的,不知道何時腦殼就開竅了,哈哈。spa

  它的原理嘛,就是遍歷數組,而後比較臨近兩個數的值的大小,最後將最小或者最大的數置換到最左邊或者最右邊。code

  下面來記錄方法:htm

public void bubbleSort () {
    for(int i = 0; i < numArr.length; i ++) {
        for(int j = 0; j < numArr.length - 1 - i; j ++) {
            if(numArr[j] > numArr[j + 1]) {
                numArr[j] = numArr[j] + numArr[j + 1];
                numArr[j + 1] = numArr[j] - numArr[j + 1];
                numArr[j] = numArr[j] - numArr[j + 1];
            }
        }
    }
}

  外層循環控制比較次數,內層從 0 下標開始循環,而後進行先後兩個數值的比較,這裏注意,內層循環到數組長度 -i 處下標便可。拿方法中的第一次循環來講:0 下標會與 1 下標元素比較大小,較大的數會被放到 1 下標位置,而後下標 1 與下標 2 比較,較大數再存儲到 下標 2 中。這樣內層循環到最後,最後一個元素存儲的值一定是大於等於其餘元素值的存在。外層第二次循環時,內層就不須要所有比對一遍了,由於最後一個值已是最大的了,只要比較剩餘的元素值便可,因此內部循環此數作 -i 處理。越到後面比起內層所有循環節省的循環此數越多哦~

  或許也能夠變成這樣,直接使用 i 進行控制內層循環的次數,數組有多少個就會兩兩間比較 長度-1 次,每次內層循環出來又會減小一次,嗯,簡化成這樣能夠了:

public void bubbleSort () {
    for(int i = numArr.length - 1; i > 0; i --) {
        for(int j = 0; j < i; j ++) {
            if(numArr[j] > numArr[j + 1]) {
                numArr[j] = numArr[j] + numArr[j + 1];
                numArr[j + 1] = numArr[j] - numArr[j + 1];
                numArr[j] = numArr[j] - numArr[j + 1];
            }
        }
    }
}

 

三、選擇排序

  這種排序也是遍歷尋找最小或者最大的值,而後單提出來存儲到一個最小或最大值變量中,作排序題時,忘了諸多排序方法,只能本身想出一個最笨的方法,結果竟然也有名字:選擇排序。

public void selectSort (int[] numArr) {
    int minSub;
    boolean isChange;
    for(int i = 0; i < numArr.length; i ++) {
        isChange = false;
        minSub = i;
        for(int j = i + 1;j < numArr.length; j ++) {
            if(numArr[minSub] > numArr[j]) {
                isChange = true;
                minSub = j;
            }
        }
        if(isChange) {
            numArr[minSub] = numArr[i] + numArr[minSub];
            numArr[i] = numArr[minSub] - numArr[i];
            numArr[minSub] = numArr[minSub] - numArr[i];
        }
    }
}

  這個排序的思路是最簡單易懂的:感受有點相似冒泡的感受,只不過多一個變量來進行存儲最大或最小的值。好比當前方法:將 0 下標元素值當成最小值進行下標存儲,而後遍歷其後元素,尋找小於當前存儲的變量值的元素,若是有,則對其下標進行存儲,直到內層循環完成後,將存儲的最小值下標與當前 0 下標值互換。最終獲得升序排序的數組。

 

四、插入排序

  簡單理解,就是將一個數據插入到已經排好序的有序數組中,從而獲得一個新的,個數 +1 的數組。核心思想就是將數組分紅兩部分,一部分包含了數組全部元素,將最後一個元素除外;第二部分就只有一個元素。然後第一部分排序完成後,再將最後元素插入到已排好序的第一部分中。

public void insertSort () {
    for(int i = 1; i < numArr.length; i ++) {
        for(int j = i; j > 0; j --) {
            if(numArr[j - 1] > numArr[j]) {
                numArr[j - 1] = numArr[j - 1] + numArr[j];
                numArr[j] = numArr[j - 1] - numArr[j];
                numArr[j - 1] = numArr[j - 1] - numArr[j];
            }
        }
    }
}

  首先將數組分紅兩個部分,一部分有序,另外一部分無序。看方法:首次循環,第一部分實際上是沒有的,直到找到最小值壓入 0 下標位置,第一部分才造成,以後每次循環都將當次循環的下標值當成待排數,然後經過遍歷已經排好的數組,判斷該值是否大於前數,若是大於就前移一位,若是不大於,則不動,放置有序數組的最後一位。

  這個也還好理解吧?

 

五、快速排序

  聽說是效率最快的,不過不如其它排序方法穩定,有可能相同值會有屢次相對位置變更,由於它的大體實現是:

  選擇一個標誌值(一般爲數組第一個元素),根據這個標誌值同時從先後遍歷查找大於或小於該值的數,將數組分紅小於標誌值和大於標誌值兩部分,通過一次快排後,左邊爲小於標誌值元素,右邊爲大於標誌值數,接着左右兩邊分別再進行快排,重複剛開始的步驟。最後直到變成有序數組。

public void quickSort (int firstSub, int lastSub) {
    int i = firstSub;
    int j = lastSub;
    int key = numArr[i];
        
    while(i < j) {
        while(i < j && numArr[j] >= key)
        j--;
            
        if(i < j){
            numArr[i] = numArr[i] + numArr[j];
            numArr[j] = numArr[i] - numArr[j];
            numArr[i] = numArr[i] - numArr[j];
            i++;
        }
            
        while(i < j && numArr[i] <= key)
        i++;
            
        if(i < j){
            numArr[j] = numArr[i] + numArr[j];
            numArr[i] = numArr[j] - numArr[i];
            numArr[j] = numArr[j] - numArr[i];
            j--;
        }
    }
    if(i > firstSub)quickSort(firstSub , i - 1);
    if(j < lastSub)quickSort(i + 1, lastSub);
}

  這個有點複雜,得仔細理解一下~

  有後續哦:http://www.cnblogs.com/guofan/p/6639941.html

相關文章
相關標籤/搜索