資料結構(C語言版) 排序

2021-10-05 13:09:59 字數 3909 閱讀 9082

1、排序:重排表中元素。

2、根據資料元素是否完全在記憶體中,將排序演算法分為內部排序和外部排序兩類。

3、插入排序:將乙個待排序記錄按關鍵字大小插入到前面已排好的子串行中,直到全部記錄插入完成。

1)直接插入排序

void insertsort(sqlist l)

l.r[j + 1] = l.r[0];}}

}(1)空間複雜度為o(1);時間複雜度為o(n2)。

(2)穩定性:插入元素時總是從後向前先比較後移動,不會出現相同元素相對位置發生變化,為穩定演算法。

(3)適用性:適用於順序儲存和鏈式儲存的線性表。

2)折半插入排序

void insertsort2(sqlist l)

else

}for (j = i - 1; j >= high + 1; --j)

l.r[high + 1] = l.r[0];}}

(1)折半查詢找出元素待插入的位置,統一地移動待插入位置之後的所有元素。

(2)時間複雜度為o(n2)。

(3)穩定性:為穩定演算法。

3)希爾排序(縮小增量排序)

void insertsort3(sqlist l)

l.r[k + j] = l.r[0];}}

}}(1)將待排序表分割成若干個子表,分別進行直接插入排序,當表中元素節本有序時,對整個表進行一次直接插入排序。

(2)空間複雜度為o(1);時間複雜度約為o(n1-2),最壞情況下時間複雜度為o(n2)。

(3)穩定性:不穩定。

(4)適用性:僅適用於順序儲存的線性表。

4、交換排序

1)氣泡排序

void bubblesort(sqlist l)

}if (flag == false)}}

(1)從後向前兩兩比較相鄰元素的值,若為逆序則交換。

(2)空間複雜度為o(1);平均時間複雜度為o(n2),最壞情況下時間複雜度為o(n2)。

(3)穩定性:穩定。

(4)雙向起泡排序。奇數趟時,從前向後比較相鄰元素的關鍵字,逆序則交換;偶數趟時,從後向前比較相鄰元素的關鍵字,逆序則交換。

void bubblesort2(sqlist l)

}high--;

for (int i = high; i >low; i--)

}low++;}}

2)快速排序

int partition(sqlist l, int low, int high)

l.r[low] = l.r[high];

while (low < high&&l.r[low].key <= pivotkey)

l.r[high] = l.r[low];

}l.r[low] = l.r[0];

return low;

}void quicksort(sqlist l,int low,int high)

}(1)最壞情況空間複雜度為o(n),平均空間複雜度為o(log2n);平均時間複雜度為o(nlog2n),最壞情況下時間複雜度為o(n2)。

(2)所有內部排序中平均效能最優的排序演算法。

5、選擇排序

每一趟在後面n-i+1個待排序元素中選取關鍵字最小的元素,作為有序序列的第i個元素,直到第n-1趟做完,待排序元素只剩乙個。

1)簡單選擇排序

void selectsort(sqlist l)

}if (min != i)}}

(1)空間複雜度為o(1);時間複雜度為o(n2)。

(2)穩定性:不穩定。

2)堆排序

void adjustdown(sqlist l,int k)//將元素向下調整

if (l.r[0].key >= l.r[i].key)

else

}l.r[k].key = l.r[0].key;

}時間複雜度與樹高(h)有關,為o(h)。

void adjustup(sqlist l, int k)//將元素向上調整

l.r[k].key = l.r[0].key;

}void buildmaxheap(sqlist l)//建立大根堆

}在n個元素序列上建堆,時間複雜度為o(n)。

void heapsort(sqlist l)

}(1)一種樹形選擇排序,在排序過程中,將l視為一棵完全二叉樹的順序儲存結構。

(2)最大堆:堆頂元素取最大值;最小堆:棧頂元素為最小值。

(2)空間複雜度為o(1);時間複雜度為o(nlog2n)。

(3)穩定性:不穩定。

6、歸併排序

1)歸併:將兩個或兩個以上的有序表組合成乙個新的有序表。

2)2路歸併排序

void merge(sqlist a, int low, int mid, int high)

for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++)

else

}while (i<=mid)

while (j <= high)

}void mergesort(sqlist l, int low, int high)

}(1)假定帶排序表含有n個記錄,則將其視為n個有序的子表,每個子表長度為1,然後兩兩歸併,得到n/2個長度為2或1的有序表,再兩兩歸併,直到合併成乙個長度為n的有序表為止。

(2)空間複雜度為o(n);時間複雜度為o(nlog2n)。

(3)穩定性:穩定。

7、基數排序

(1)分類:最高位優先(msd)、最低位優先(lsd)。

(2)一趟排序需要輔助儲存空間為r,空間複雜度為o(r);基數排序需要進行d趟分配和收集,一趟分配需要o(n),一趟收集需要o(r),故基數排序時間複雜度為o(d(n+r)),與序列的初始狀態無關。

(3)穩定性:穩定。

8、內部排序的比較

演算法種類

時間複雜度

空間複雜度

是否穩定

最好情況

平均情況

最壞情況

直接插入排序

o(n)

o(n2)

o(n2)

o(1)

是氣泡排序

o(n)

o(n2)

o(n2)

o(1)

是簡單選擇排序

o(n2)

o(n2)

o(n2)

o(1)

否希爾排序

o(1)

否快速排序

o(nlog2n)

o(nlog2n)

o(n2)

o(log2n)

否堆排序

o(nlog2n)

o(nlog2n)

o(nlog2n)

o(1)

否2路歸併排序

o(nlog2n)

o(nlog2n)

o(nlog2n)

o(n)

是基數排序

o(d(n+r))

o(d(n+r))

o(d(n+r))

o(r)

是折半插入排序

o(n2)

o(n2)

o(n2)

o(1)

是9、排序小結

1)n較小,採用直接插入排序或簡單選擇排序。

2)初始狀態基本有序,採用直接插入排序或氣泡排序。

3)n較大,採用快速排序、堆排序、歸併排序。

4)n較大,關鍵字位數較少,且可分解,採用基數排序。

10、外部排序通常採用歸併排序方法。

1)外部排序所需總時間=內部排序所需時間+外存資訊讀寫時間+內部歸併所需時間

2)多路平衡歸併

(1)敗者樹:完全二叉樹且不含葉子,可採用順序儲存結構。

3)置換-選擇排序:在整個排序過程中,選擇最小(或最大)關鍵字和輸入、輸出交叉或平行進行。

4)最佳歸併樹

資料結構C語言版堆排序

堆排序的由來還得說到簡單選擇排序,由簡單選擇排序中的在進行剩餘的n 2個資料比較時若能利用前n 1次比較的所得資訊,則可以減少以後各趟排序的比較次數,由此聯想出錦標賽排序也就是樹形排序,但是樹形排序的輔助儲存空間較多,和 最大值 進行比較多餘的比較等缺點,因此,在1964年威洛姆斯提出了堆排序,堆排...

資料結構(C語言版)

用棧實現數字的進製轉換 10轉8 棧 限定只能在表尾進行插入或者刪除操作的線性表 特點 先進後出 儲存表示方法 順序棧和鏈棧 本文用的順序棧 實現 readonly name code class c include include define stack init size 100 儲存空間初始...

《資料結構(C語言版)》綜述

第一章 緒論 將於4月20日學習完畢,含課後題以及資料練習題 1.1什麼是資料結構 1.2基本概念和術語 1.3抽象資料結構型別的表示與實現 1.4演算法和演算法分析 1.4.1演算法 1.4.2演算法設計的要求 1.4.3演算法效率的度量 第二章 線性表 2.1線性表的型別定義 2.2線性表的順序...