排序在我們的生活和生產中是很重要的, 據說在計算時代早期, 大家普遍認為30%的計算週期都用在了排序上, 現在的這個比例下降了, 原因可能是排序演算法更加高效, 但絕不可能是因為排序的重要性降低了
這篇文章不會像書上說的那樣實現comparable介面, 接下來的所有**都將是對整型陣列的操作
選擇排序的思路很簡單, 就是遍歷整個陣列, 將最小的數挑出來, 放在第乙個的位置上, 之後繼續遍歷, 迴圈n次, 這裡用到了雙重迴圈, 所以我們可以很輕鬆的了解到它的時間複雜度為o(n):
1public
class
selectsort ;
4for(int i = 0; i < 10; i++)
5 system.out.print(a[i] + " ");
6system.out.println();78
for(int i = 0; i < 10; i++) 14}
15int tmp =a[i];
16 a[i] =a[min];
17 a[min] =tmp;18}
1920
for(int i = 0; i < 10; i++)
21 system.out.print(a[i] + " ");
22system.out.println();
23}
2425 }
插入排序的思路就是對於這個陣列, 有兩個部分, 已排好序的部分和未排好序的部分, 我們每次都將未排好序的部分的第乙個數插入到已排好序的部分的相應位置, 然後已排好序的部分加一, 未排好序的部分減一, 直到陣列全部排好序. 在這其中, 我們也用到了雙重迴圈, 所以我們也可以很輕易的得到它的時間複雜度也是o(n):
1public
class
insertionsort;
4for(int i = 1; i < 11; i++)
5 system.out.print(a[i] + " ");
6system.out.println();78
for(int i = 1; i < 10; i++) 16}
1718
for(int i = 1; i < 11; i++)
19 system.out.print(a[i] + " ");
20system.out.println();21}
22 }
我們也將a[0]設定為哨兵, 我們將哨兵作為邊界, 它的作用就是當迴圈到了邊界時會停下來, 這樣我們就不用每次都詢問是否到達了邊界:
1public
class
insertionsort;
4for(int i = 1; i < 11; i++)
5 system.out.print(a[i] + " ");
6system.out.println();78
for(int i = 2; i < 10; i++)
14 a[j-1] = a[0];15}
1617
for(int i = 1; i < 11; i++)
18 system.out.print(a[i] + " ");
19system.out.println();20}
21 }
雖然二者的時間複雜度都是o(n), 但相較於選擇排序, 插入排序有乙個特點, 那就是它可以在資料傳輸過程中它就可以進行排序, 而選擇排序不行, 打個比方, 你在打撲克牌時, 如果是選擇排序, 你只能在摸玩所有的牌之後進行排序, 但是如果是插入排序, 你可以在摸牌的過程中就將手上已經有的牌排好序, 讓你手中已經有的牌一直保持有序狀態
雖然這兩種排序都很簡單, 效率也不是很高, 但是他們有一些其他的高階演算法所不具有的特性, 也可以對其他的較為高階的排序進行優化, 讓那些高階的排序演算法更加高效
《演算法(第四版)》排序 插入排序
插入排序與選擇排序一樣,當前索引左邊的所有元素都是有序的,但和選擇排序不一樣的是它們的位置不是固定的,可能為了更小的元素騰出空間,它們向後移動,但是當索引達到陣列的右端時,陣列排序就完成了 使用插入排序為一列數字進行排序的過程 具體演算法描述如下 從第乙個元素開始,該元素可以認為已經被排序 取出下乙...
插入排序(演算法第四版)
原理闡述 就像打牌一樣,拿到手上的是無序的牌,從第二張開始,將牌一張一張與前面的比較,遇到第乙個比自己小的,就插在它後面,依次執行到最後一張,結束後,就排好序了 note 3 5 2 1 以2為例 3 2 5 1 2 3 5 1 2 3 1 5 2 1 3 5 1 2 3 5 實現 package ...
《演算法(第四版)》排序 希爾排序
由 插入排序 可知,它是一種不穩定的演算法,當序列已經接近有序時,排序速度較快,但是如果最小的在最後面,那可能需要最小的交換了n 1次才能換到最前面。希爾排序在插入排序的基礎上進行了改進,交換不相鄰的元素,以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序,具體做法如下。1.假設陣列長...