修煉演算法內功 插入排序(一)

2021-08-22 02:38:26 字數 1283 閱讀 4242

1、最切合實際的例子

在我們生活中,常見的撲克牌就是乙個很好的例子。正常人抓牌通常都是如下的幾個步驟:

抓取第一張排放在手中;

抓取第二張牌與第一張做比較,如果比第一張大則放在左邊,反之,右邊。(放在哪邊是個人習慣務必較真)

抓取第三張先與第一張比較,大左小右;再與第二張比較,大左小右。

重複抓取並迴圈比較,直到牌抓完。(實際人類不會每次都去一次次地去比較,再去插入)

2、插入排序

示例:5、3、1、2、4(亂序數)——>1、2、3、4、5(有序數)

第一趟——>5作為有序數放在arr[0]——5、3、1、2、4

第二趟——>3與5比較,放在arr[0],5左移——3、5、1、2、4

第三趟——>1先如5比較,1與5交換;1再與3比較,1與·3交換——1、3、5、2、4

第四趟——>2先與5比較,2與5交換;2與3比較,2與3交換;2與1比較,不必交換——1、2、3、5、4

第五趟——>4先與5比較,4與5交換;4再與3比較,不必交換;比較停止——1、2、3、4、5

3、演算法分析

**塊:

templatevoid insertionsort(t arr,int n) 

}}

4、效能測試(函式寫在sorttesthelper.h標頭檔案中,作為自定義函式呼叫)

(1)、函式時間的測試

//函式時間測試

templatevoid timetestsort(string sortname, void(*sort)(t, int), t arr, int n)

(2)、驗證函式排序的正確性

//驗證函式排序的正確性

templatebool issorted(t arr, int n)

return true;

}

(3)、函式的複製

//函式的複製	

int* copyintarray(int a,int n)

};

主函式呼叫

int main()
執行結果:

結果很顯然插入排序的時間遠大於選擇排序演算法。那麼能找到更加優化的插入排序演算法嗎?

修煉內功 資料結構與演算法9 插入排序

插入排序的原理我們將陣列中的資料分為兩個區間,已排序區間和未排序區間。初始已排序區間只有乙個元素,就是陣列的第乙個元素。插入演算法的核心思想是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間資料一直有序。重複這個過程,直到未排序區間中元素為空,演算法結束。插入排序實現...

修煉演算法內功 選擇排序(一)

內容 1 簡單的選擇排序 2 使用模板 泛型 使演算法更加靈活 3 使用結構體完成學生的name和score屬性的排序 4 隨機生成演算法測試用例。寫在前面 為什麼學習o n 2 的排序演算法?基礎 1 selection sort 選擇排序 基本思路 如 8 6 2 3 1 5 7 4 對乙個序列...

內功修煉之O n 的排序演算法(一)

本文參考程式設計師內功修煉課程,所有實現 均能在github上找到。一 選擇排序 selection sort 1 基本思想 給定陣列int arr 第 1趟排序,在待排序資料arr 1 arr n 中選出最小的 資料,將它與arr 1 交換 第 2趟,在待排序 資料arr 2 arr n 中選出最...