關於排序的一點點東西 2

2021-09-11 12:51:21 字數 1316 閱讀 4297

我們怎麼來實現乙個插入排序呢

從第乙個元素開始,該元素可以認為已經被排序

取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

如果該元素(已排序)大於新元素,將該元素移到下一位置

重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

將新元素插入到該位置後

重複步驟2~5

當然有圖就更直觀啦 **

維基百科

那麼,我們來看看**怎麼實現:

void

insertionsort

(int arr, int len)

else

}arr[tempindex] = temp;

}}複製**

這段**還可以再精簡一下。不過意思就是這個意思了。哈哈。

插入排序的比較是從有序序列的末尾開始,依次向前比較,相等元素的前後順序是不會改變的。所以插入排序是穩定的。

我們先來看一張圖 **

維基百科

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

步驟為:

從數列中挑出乙個元素,稱為"基準"(pivot)

重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴到最底部時,數列的大小是零或一,也就是已經排序好了。這個演算法一定會結束,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

簡單的說,就是不斷的把陣列分為左邊(小於基準點)和右邊(大於等於基準點)的兩個子陣列。

void

quicksort

(int arr, int startindex , int len)}}

}temp = arr[startindex];

arr[startindex] = arr[left];

arr[left] = temp;

if (left > startindex)

if (left + 1

< startindex + len - 1)

}複製**

(寫得不好,下次優化?)

快速排序是不穩定的排序。不穩定的時間點發生在中心交換的時候。例如5 3 3 4 3 8 9 10 11這個陣列,最後5和3交換的時候,就打亂了3的順序。

下次再見...

關於排序的一點點東西 1

最近複習演算法的東西。於是在網上查詢相關資料,重新了解下幾種常見的排序演算法。中空白的地方,待了解到那裡來的時候再填上?時間複雜度和空間複雜度概念就不用解釋了,穩定性這個東西已經忘記是什麼了 演算法老師不要打我 看看了資料,原來說的是 排序前兩個相等的資料在序列中的順序與排序後的順序相同。簡單的說就...

關於Lisp的一點點

以後寫的語言相關應該主要是ruby 也許還有少數的c 了,所以在這裡先記錄一點關於lisp的東西。首先是乙個小故事 在 ilc 2002 大會上前lisp大神,當今的python倡導者peter norvig,由於某些原因,做乙個類似於馬丁路德在梵蒂岡宣揚新教的主題演講,因為他在演講中大膽地聲稱py...

深度學習的一點點一點點知識

我們手裡有大量的x和y,求權重訓練的是權重資料樣本 xwy 身高0體重0 血型0.3 腳指頭0.8 一組x計算出對應的乙個y 計算過程是w 下面的就是最基礎的公式 我們已知資料是大量的x和y 希望通過 西塔 來獲得w 我們的學習才剛剛開始,首先需要理解的是與門 x1x2y0 0001 0100 11...