程式猿修仙之路 演算法之選擇排序

2021-09-16 12:03:17 字數 2556 閱讀 9968

在演算法時間複雜度維度,我們主要對比較和交換的次數做對比,其他不交換元素的演算法,主要會以訪問陣列的次數的維度做對比。

其實有很多同學對於演算法的時間複雜度有點模糊,分不清什麼所謂的 o(n),o(nlogn),o(logn)…等,也許下圖對一些人有一些更直觀的認識。

排序演算法的額外記憶體開銷和執行時間同等重要。 就算乙個演算法時間複雜度比較優秀,空間複雜度非常差,使用的額外記憶體非常大,菜菜認為它也算不上乙個優秀的演算法。

這個指標是菜菜自己加上的,我始終認為乙個優秀的演算法最終得到的結果必須是正確的。就算乙個演算法擁有非常優秀的時間和空間複雜度,但是結果不正確,又有什麼意義呢?

在起始位置右側(或左側)找出最小的那個元素,然後和起始位置的元素交換

選擇排序是乙個不穩定的排序演算法

具體步驟如下:在乙個資料列表中找到最小的那個元素,將它和列表的第乙個元素交換位置。

在第二個元素位置開始再次尋找最小的那個元素,然後和列表的第二個位置的元素交換。

在第三個元素位置開始再次尋找最小的那個元素,然後和列表的第三個位置的元素交換

如此反覆,直到開始查詢起始位置到達列表末尾。

如果查詢過程中最小的元素就是起止位置的元素,那麼它就和它自己交換。

++因為這種演算法總是在不斷的選擇剩餘元素中最小者,因此得名選擇排序++

比較次數

對於長度為n的列表,選擇排序需要大約n² /2次比較.即:o(n²)平方級別。

交換次數
對於長度為n的列表,選擇排序需要大約n次交換.即:o(n) 線性級別。

總體來說,選擇排序是一種比較簡單的排序演算法,很容易理解也很好用**實現,當然他的特點也很明顯:

執行時間和資料初始狀態無關

為什麼這麼說呢?演算法進行中為了查詢最小的元素而遍歷列表並不能為下次遍歷帶來任何資訊,這個特性在大部分情況下是缺點。如果乙個資料列表初始狀態是有序的或者部分有序的,選擇排序仍然需要全部掃瞄一次和交換。因此和乙個完全無序的列表排序所花的時間相差不大。

資料移動次數是最少的

每次交換只會改變兩個列表元素,因此長度為n的列表只會發生n次交換,交換次數和列表的長度是線性關係,其他演算法都不具備這個特性。

首先我們要明白演算法穩定是什麼意思呢?

在待排序的資料中,存在多個相同的資料,經過排序之後,他們的相對順序依舊保持不變,實際上就是說array[i]=array[j],i根據以上定義很容易可以得出這樣的結論:

我們舉出乙個例項,序列5 8 5 2 9, 這個在執行選擇排序的時候,第一遍,肯定會將array[0]=5,交換到2所在的位置,也就是 2 8 5 5 9,那麼很顯然,之後的排序我們就會發現,array[2]中的5會出現在原先的array[0]之前,所以選擇排序不是乙個穩定的排序

static void main(string args)

//列印原始陣列值

console.writeline($"原始資料: ");

int n = data.count;

for (int i = 0; i < n; i++)

}//交換最小的元素和當前位置的元素,當然這裡可以加入乙個最小元素是否是當前位置元素的判斷來較少交換次數

int tempitem = data[i];

data[i] = data[minindex];

data[minindex] = tempitem;

}//列印排序後的陣列

console.writeline($"排序資料: ");

console.read();

}

執行結果:

原始資料:97,85,61,22,62,12,67,22,68,42

排序資料:12,22,22,42,61,62,67,68,85,97

go

家裡沒環境,還得翻牆,以後再補上吧,望見諒。

獨樂不如眾樂

老媽剛要收拾收拾衛生…老公就笑著說道:「媽,您大老遠過來,哪能讓你打掃家務…」然後老公就讓我帶我媽出去逛逛街,家務他全包了…就這樣,我被老媽拉了出去,我生氣的對老媽說道:「明明我都看到地毯底下的錢了,為什麼不讓我拿出來!」老媽淡定的說道:「要嘛,你現在回去把那錢拿出來翻臉!要嘛,現在就跟我逛街去!以後家務也不用做了!你選吧…

2 演算法之路 選擇之堆排序

題目 選擇排序法的概念簡單,每次從未排序部份選一最小值,插入已排序部份的後端,其時間主要花費於在整個未排序部份尋找最小值,如果能讓搜尋最小值的方式加 快,選擇排序法的速率也就可以加快 heap 排序法讓搜尋的路徑由樹根至最後乙個樹葉,而不是整個未排序部份,從而可以加快排序的過程,因而稱之為改良的選擇...

1 演算法之路 選擇排序

選擇排序 演算法 1.將要排序的物件分作 2部份,乙個是已排序的,乙個是未排序的 2.從後端未排序部份選擇乙個最小值,並放入前端已排序部份的最後乙個 e.g 排序前 70 80 31 37 10 1 48 60 33 80 1 80 31 37 10 7048 60 33 80 選出最小值1 1 1...

程式猿必學之堆排序

前情了解 例如 了解了完全二叉樹之後,就可以來看一下什麼是堆?堆實際上就是乙個完全二叉樹,不同的地方在於 它是有規律的完全二叉樹,也就是說堆一定是完全二叉樹,但完全二叉樹卻不一定是堆。對於一棵完全二叉樹來說,如果它的任意乙個父節點的值都大於或等於它的兩個子節點,這樣的堆叫做大根堆,又稱最大堆 大頂堆...