O N 2 排序演算法分析 選擇排序和插入排序

2022-07-29 02:36:09 字數 2192 閱讀 7742

基本思想:每次遍歷陣列,找到當前陣列中最小的乙個元素,與第乙個元素調換位置。

第一次排序:遍歷8個元素,找到當前陣列中最小元素2,與第乙個元素調換,此時,2現在的位置就是其最終的位置

第二次排序:從第二個元素開始遍歷,找到最小的元素4,與第二個元素8對調位置

第三次排序最小的元素時5,與當前位置對換,即可以理解為自己和自己對換位置,第三次排序後的結果為:2 4 5 7 6 8 9 7,按照同樣的方法,可以得到

第四次排序結果:2 4 5 6 7 8 9 7 ,第五次排序結果:2 4 5 6 7 8 9 7 ,第六次排序結果:2 4 5 6 7 7 8 9  ,第七次排序結果 :2 4 5 6 7 7 8 9 第八次排序結果:2 4 5 6 7 7 8 9。

因此對於選擇排序,可以看出,當第六次的時候已經有序,但後續步驟任然需要進行後續所有元素的遍歷,實現**如下:

public

static

void

sort(comparable arr)

}sorthelper.swap(arr,i,minindex);}}

測試:

public

static

void

main(string args)

執行結果:(n=10000)

相比兩個測試結果,執行效率差不多慢了100倍。

第一次比較過程:

第二次比較過程:

第三次比較:

實現**如下:

public

static

void

sort(comparable arr)else //}

//精簡一點的寫法

for(int j = i ; j > 0 && arr[j].compareto(arr[j-1])<0 ; j--)}}

測試用例:

public

static

void

main(string args)

執行結果:

當n相差10倍的時候,執行時間差不多相差了近100倍。

雖然兩個演算法都是o(n^2)的時間複雜度,但是對於插入排序,如果待排序序列接近有序的時候,插入排序的比較次數明顯減少,因此在待排序序列接近有序的時候,插入排序的時間複雜的會接近o(n),同時,本例中插入排序存在著不斷的調換位置的情況,需要消耗一定的時間,下面的我們將對插入排序進行優化。

交換的次數少一些

public

static

void

sort2(comparable arr)

arr[j] =e;}}

測試結果:

最後,用乙個接近有序的序列,再來測試一樣兩種情況

選擇排序測試結果(n=100000 和  n=10000):

插入排序測試結果(n=100000 和  n=10000):

整數奇偶數排序(o n 2 排序演算法)

description 給定10個整數的序列,要求對其重新排序。排序要求 1.奇數在前,偶數在後 2.奇數按從大到小排序 3.偶數按從小到大排序。input 輸入一行,包含10個整數,彼此以乙個空格分開,每個整數的範圍是大於等於0,小於等於100。output 按照要求排序後輸出一行,包含排序後的1...

演算法 O n 2 排序演算法的效率比較

選擇 插入排序 main.cpp 1 include 3 include sorttesthelper.h 4 5using namespace std 67 template8 void selectionsort t arr,int n 16 1718 template19 void inser...

分數線劃定(o n 2 排序演算法)

description 世博會志願者的選拔工作正在 a 市如火如荼的進行。為了選拔最合適的人才,a市對所有報名的選手進行了筆試,筆試分數達到面試分數線的選手方可進入面試。面試分數線根據計畫錄取人數的150 劃定,即如果計畫錄取m名志願者,則面試分數線為排名第 m 150 向下取整 名的選手的分數,而...