使用C 詳解常用排序演算法(一) 概述

2021-07-04 10:36:18 字數 1427 閱讀 4259

最近在複習一些演算法相關的知識,為了加深對各種演算法的理解和認識,使用c#語言把各種型別的排序演算法實現了一下,現發篇部落格,與大家共享,也希望的到批評指正。本文主要依據和參考文獻為thomas h.cormen、charles e.leiserson等著的《演算法導論》(《introduction to algorithms》)

對本書感興趣的朋友們可以從 獲得英文版和中文版的pdf檔案:

排序在計算機領域的重要性不言而喻。時間複雜度、空間複雜度是衡量演算法效能的重要指標,特別是時間複雜度。此外,在衡量排序演算法時其演算法的穩定性也是乙個指標。排序演算法的穩定性指的是:當認為乙個排序演算法是穩定的,那就意味著如果在待排序集合內有兩個相等(排序依據)的元素e1和e2,在排序後,他們的先後次序不變。

舉個例子,我們這裡有乙個集合,列舉了張

三、李四、王

五、趙六這四個人所使用過的手機數量,分別是:張三(4),李四(2),王五(3)、趙六(2)。現在如果要按照使用過的手機數量從小到大排序,那麼穩定的排序演算法給出的結果是:

李四(2),趙六(2),王五(3),張三(4)。

不穩定的排序演算法給出的結果則可能是:

趙六(2),李四(2),王五(3),張三(4)。

本文將要實現的主要排序演算法及特點如下:

1.插入排序(insert sort):θ(n^2);穩定;

2.歸併排序(merge sort):θ(nlgn);穩定;

3.氣泡排序(bubble sort):θ(n^2);穩定;

4.堆排序 (heap sort):θ(nlgn);不穩定;

5.快速排序(quick sort)及隨機快速排序(randomized quick sort):平均複雜度為θ(nlgn),最差複雜度為θ(n^2);不穩定;常用。

6.stooge sort :θ(n^2.7);穩定;不實用;**簡短;

7.計數排序(count sort):θ(n);穩定;消耗較多額外記憶體。

本文使用c#實現常用的排序演算法,為了保持**的美觀和可重用性,採用了封裝技術,實現平台為微軟最新的visual studio community 2015,為console程式。下文會詳細敘述**的構成特點。

下圖是整個解決方案的目錄

主要由4個檔案組成:

1.functiontool.cs

主要功能是生成隨機數,以及生成隨機數陣列。對於測試一些大量資料的陣列還是有用的,不用自己去設計。

2.heap.cs

描述了乙個堆的實現,主要的方法有根據乙個節點的索引(index)計算得出其父節點以及左右子節點的索引值;最大化堆操作;構建乙個最大化堆以及堆排序功能。

3.program.cs

main函式的入口

4.sorting.cs

排序演算法 一 概述

排序是程式開發中一種非常常見的操作,對一組任意的資料元素 或記錄 經過排序操作後,就可以把他們變成一組按關鍵字排序的有序佇列。對於排序演算法從以下幾點去衡量演算法的優劣 時間複雜度,所謂時間複雜度就是將一組數從無序到有序所花費的時間,通常使用乙個量級去衡量,比如o n 或者 o n n 空間複雜度,...

Java排序演算法(一) 概述

排序是程式開發中一種非常常見的操作,對一組任意的資料元素 或記錄 經過排序操作後,就可以把他們變成一組按關鍵字排序的有序佇列。對乙個排序演算法來說,一般從下面3個方面來衡量演算法的優劣 時間複雜度 它主要是分析關鍵字的比較次數和記錄的移動次數。空間複雜度 分析排序演算法中需要多少輔助記憶體。穩定性 ...

演算法筆記一 概述

分析乙個演算法,主要是考量它的執行的時間代價和空間代價,而在評估時間代價時,還要分析下最好情況下的代價和最壞情況下的代價。最好情況,用來分析該演算法的最佳應用場景 最壞情況,用來確定該演算法的最長執行時間的上限 某些演算法可能會更加的關注於平均情況,當平均情況趨向於較好情況時,是有意義的,這裡就需要...