研磨演算法 排序之初級排序(選擇 插入 冒泡)

2021-08-20 07:11:42 字數 1764 閱讀 7129

標籤(空格分隔): 研磨演算法

插入排序

氣泡排序

排序演算法是在基礎面試中經考到的演算法,也常常是我們解決問題的第一步。雖然在實際專案開發中很小幾率會需要我們手動實現,但是這些思想是我們需要學習的。本文將會剖析三種最出擊的排序演算法:選擇、插入、冒泡

選擇排序是最簡單直觀的一種演算法,之所以叫做選擇排序,是因為不斷地選擇剩餘元素中最小(大)的:

基本思想為每一趟從待排序的資料元素中選擇最小(或最大)的乙個元素作為首元素,直到所有元素排完為止。

在演算法實現時,我們通過設定乙個變數min,在排序的內迴圈中每一次比較僅儲存較小元素的陣列下標,當輪迴圈結束之後,那這個變數儲存的就是當前最小元素的下標。此時再在外迴圈中執行交換操作即可。

雙層迴圈:

public static void selectsort(int a) 

}swap(a,i,min);

}show(a);

}

總的來說,選擇排序是一種容易理解和實現的簡單排序演算法,它有兩個鮮明的特點:

資料移動最少,n次交換,與陣列的大小是線性關係。

對於選擇排序,大約需要n^2/2次比較和n次交換。綜合下來,時間複雜度為o(n2)

每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。

與選擇排序一樣,當前索引左邊的所有元素都是有序的,但還不是最終的位置,再插入元素時,需要給插入的元素騰出空間,在陣列中就是將後面的元素都右移。當索引達到陣列的最右端時,排序結束。

兩層迴圈:

public

static

void

insertsort(int a)

}system.out.println("insert sort");

}

插入排序在最好情況下,需要比較n-1次,無需交換元素,時間複雜度為o(n);在最壞情況下,時間複雜度依然為o(n2)。

與選擇排序不同,插入排序所需的時間取決於輸入中元素的初始順序。對於部分有序的陣列會很有效。也很適合小規模陣列。

這些型別的陣列會在十幾種經常豎線,也是高階排序演算法中的中間過程。所以在學習高階配需演算法時會使用。

在內迴圈中將較大的元素都向右移動而不是交換兩個元素,這樣能夠使訪問陣列的次數減半:

public

static

void

insertsort(int a)

a[j+1] = temp;

} }

氣泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素「浮」到頂端,最終達到完全有序

在氣泡排序的過程中,如果某一趟執行完畢,沒有做任何一次交換操作,比如陣列[5,4,1,2,3],執行了兩次冒泡,也就是兩次外迴圈之後,分別將5和4調整到最終位置[1,2,3,4,5]。此時,再執行第三次迴圈後,一次交換都沒有做,這就說明剩下的序列已經是有序的,排序操作也就可以完成了,來看下** 

public

static

void

bubblesort(int a)

}if (flag)

}}

根據上面這種冒泡實現,若原陣列本身就是有序的(這是最好情況),僅需n-1次比較就可完成;若是倒序,比較次數為 n-1+n-2+…+1=n(n-1)/2,交換次數和比較次數等值。所以,其時間複雜度依然為o(n2)。

演算法之初級排序

講排序之前先來幾個簡單的函式 交換函式 public static void swap comparable a,int i,int j 小於函式 public static boolean less comparable v,comparable w 首先找到陣列中的最小元素,將它和陣列的第乙個元...

演算法之初級排序

將整個集合中最小的元素放置到集合最前面位置,繼續在剩下的集合中找到最小的元素放到剩下集合的最前面位置。一直迴圈重複這個步驟,直到整個集合有序。附加動畫 將當前元素插入到子集合中合適的位置。第一步從集合第乙個位置開始,遍歷到集合結束。當前元素為當前遍歷位 置的元素。子集合是指整個集合開始位置與當前遍歷...

Java初級排序演算法 選擇排序 插入排序 希爾排序

package sort import edu.princeton.cs.algs4.in public class example private static boolean less comparable v,comparable w private static void exch comp...