C語言排序演算法總結

2021-06-22 09:09:46 字數 1580 閱讀 6381

排序演算法一直都是讓我頭疼的演算法。為了全面掌握排序演算法,我就整理了常用的排序演算法。

首先我們來了解一些基本概念:

(1)穩定排序和非穩定排序

簡單地說就是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,我們就

說這種排序方法是穩定的。反之,就是非穩定的。

比如:一組數排序前是a1,a2,a3,a4,a5,其中a2=a4,經過某種排序後為a1,a2,a4,a3,a5,

則我們說這種排序是穩定的,因為a2排序前在a4的前面,排序後它還是在a4的前面。假如變成a1,a4,

a2,a3,a5就不是穩定的了。

(2)內部排序和外部排序

在排序過程中,所有需要排序的數都在記憶體,並在記憶體中調整它們的儲存順序,稱為內排序;

在排序過程中,只有部分數被調入記憶體,並借助記憶體調整數在外存中的存放順序排序方法稱為外排序。

(3)演算法的時間複雜度和空間複雜度

所謂演算法的時間複雜度,是指執行演算法所需要的計算工作量。

乙個演算法的空間複雜度,一般是指執行這個演算法所需要的記憶體空間。

(1)選擇排序演算法:它是非穩定的。每一趟在n-i+1個記錄中選取最小的記錄作為有序序列的第i的記錄。它的演算法如下:

void choose_sort(

int*x,

int n)

/*x陣列名 n為陣列長度*/if(

min!

= i)}}

(2)直接插入排序:將乙個記錄插入到排好序的記錄中,從而得到乙個新的有序表。它的演算法如下:

void insert_sort(

int*x,

int n)

x[j+1]

= t;}}

(3)快速排序:是對氣泡排序的一種改進。它首先需要乙個函式partition()將要排序的記錄以low為中心分成兩個部分:比x[low]下小的放low前面,比x[low]大的放low後面。假設第一趟分成了如下兩部分:

x[s],x[s+1]...x[i-1]和x[i+1],x[i+1]...x[t]

可以看書,low==i.

之後我們這兩部分再進行partition()函式排序。

partition(int *x, int low, int high)解析:

我們從high開始逆序找,從low開始順序找,最後low等於high後便退出這一趟排序。**如下:

int

partition

(int

*x,int low,

int high)

x[low]

= key;

return low;

}

遞迴對所有被分割的序列排序:

void

qsort

(int

*x,int low,

int high)

}

最後完成該函式:

void quicksort(

int*x,

int n)

0

給主人留下些什麼吧!~~

排序演算法總結(C語言)

總結包括 氣泡排序 選擇排序 插入排序 希爾排序 堆排序 歸併排序 快速排序 桶排序 氣泡排序是從後往前 或從前往後 比較相鄰的兩個元素,如果有逆序則交換他們。這樣每趟就將最小 或最大 元素移到待排元素的一端。最多n 1趟,就可以把所有元素排好序。時間複雜度 最好情況 最壞情況 額外空間複雜度 穩定...

C語言排序演算法總結

學計算機程式設計的應該都知道,演算法是程式之魂。所謂演算法,就是解決問題的方法加上有限的實現步驟。演算法的特點有有窮性,確定性,有效性,有零個或多個輸入,有乙個或多個輸出。下面我們就來簡單總結一下c語言中的三種經典排序演算法。一 冒泡演算法。所謂氣泡排序法,就是對一組數字進行從大到小或從小到大排序的...

C語言排序演算法總結 希爾排序

之前我們總結了比較簡單的幾種排序方法。冒泡,選擇,排序。但是也提到了這些排序方法的缺陷。時間複雜度太高,在有大量資料需要排序的時候,會需要浪費太多的時間。所以在很多場景中是不適合使用。我們這次總結一種時間複雜度更優秀的希爾排序。希爾排序是以插入排序為基礎的改進版本。是由shell提出的方法。所以就叫...