大話資料結構 幾種排序演算法

2021-08-03 12:17:53 字數 2556 閱讀 9863

這篇筆記主要是寫寫這些常見的排序演算法。

思想:兩兩比較相鄰記錄的關鍵字,反序則交換,直到沒有反序為止。

#include /*交換int型陣列l中下標i和j的值*/

void swap(int *l, int i, int j)

void bubblesort(int *l)

} }}

分析:最好的情況比較n-1次,時間複雜度o(n);最壞的情況比較n(n-1)/2次,時間複雜度o(n2)。

思想:每趟在n-i+1次比較裡,選擇關鍵字最小的記錄與第i個記錄交換。

void selectionsort(int *l)

} if (i != min)

swap(l, i, min);

}}

分析:比較次數,最好最壞都是n(n-1)/2次;交換次數,最好0次,最壞n-1次,綜合起來時間複雜度是o(n2)。效能比冒泡好一點。

思想:將乙個記錄插入到已經排好序的有序表中,表記錄數加1。

void insertiontsort(int *l)

l[j] = temp; /*插入到正確的位置*/

}}

分析:如果記錄順序是隨機的,平均比較和移動的次數為n2/4,時間複雜度是o(n2)。效能比冒泡和選擇要好一點。

思想:(也稱縮小增量排序)給出乙個增量increment,讓相隔增量的記錄跳躍式的移動,這增加了效率。最後的increment必須為1。

void shellsort(int *l)

} }

分析:確定增量的取值也是乙個問題,大量實驗證明,其平均時間複雜度o(n3/2)。希爾排序的出現突破了慢速排序(o(n2))的時代,更為高效的演算法陸續出現。

思想:堆是一種特殊的完全二叉樹,它只有兩種:每個結點大於等於它子結點的是大頂堆,小於等於它子結點的是小頂堆。堆排序就是通過構造堆來排序。將待排序陣列構成乙個大頂堆,把堆頂的根結點(最大值)移走,也就是和堆陣列末尾交換,最大值就到了陣列最後,再將剩下n-1個數重新構造成乙個堆,找到n個元素中第二大值,重複執行。

關鍵:1如何將原始無序陣列構建成乙個堆

2輸出堆頂元素後,如何調整剩餘元素成為新堆

void swap(int *l, int i, int j)

void heapsort(int *l)

}void heapadjust(int *l, int i, int j)

l[i] = temp;

}

分析:能提高效率是因為充分利用了二叉樹深度是 ⌊log2n⌋+1 的性質。構建堆的時間複雜度o(n),重建堆的時間複雜度是o(nlogn),所以總的時間複雜度是o(nlogn)。

思想:將乙個無序的陣列,兩兩合併排序後再合併,最終得到有序陣列。

#include #include void mergesort(int *l, int p, int r)  //用歸併的方式把陣列不斷二分

}void merge(int *l, int p, int q, int r) //合併函式

for (; i < n1; i++) //如果左陣列有元素剩餘,則將剩餘元素合併到l

l[k++] = left[i];

for (; j < n2; j++) //如果右陣列有元素剩餘,則將剩餘元素合併到l

l[k++] = right[j];

}

分析:結構類似於顛倒的完全二叉樹,整個歸併排序需要進行 ⌈log2n⌉ 次,則總的時間複雜度是o(nlogn);但因為過程中需要與原陣列同大小的空間存放遞迴結果,並且要遞迴深度是 log2n 的棧空間,則空間複雜度是o(n+logn)。它是一種比較佔記憶體、但效率高且穩定的排序演算法。

思想:選取乙個關鍵字(開始一般key=sqlist[0]),找到它在陣列中的位置,也就是從兩端向中間掃瞄陣列,通過交換把key的放後面;一次遍歷終了相當於把整個陣列partition成兩部分(被key分開,未必平均分),遞迴每部分。

#includevoid quicksort(int *a, int p, int r)

for (; a[i] <= x && i < j; i++){}

if (i < j)

else

} quicksort(a, p, j - 1);

quicksort(a, j + 1, r);

}}

還有一種比較優美的寫法,

void quicksort(int a, int left, int right)

a[i] = key;

quicksort(a, left, i - 1);

quicksort(a, i + 1, right);

}

分析:平均時間複雜度是o(nlogn),少數最差情況雖然也能達到o(n2);因為遞迴使用棧空間,平均情況的空間複雜度是o(logn)。因為關鍵字的比較和交換是跳躍的,所以它是種不穩定的方法。

《大話資料結構》 排序

排序的穩定性 ri rj,在排序前ri領先於rj,如果排序後ri仍然領先於rj,則稱為所用的排序演算法是穩定的 反之,若可能使得排序後rj領先於ri,則稱為該排序演算法是不穩定的。內排序和外排序 內排序 排序的整個過程中,待排序的所有記錄全部存放在記憶體中。常見的內排序演算法有 氣泡排序 簡單選擇排...

氣泡排序 大話資料結構

用於要排序陣列個數最大值,可修改 define maxsize 10 typedef struct sqlist 交換l中陣列r的下標為i和j的值 void swap sqlist l,i,j 氣泡排序初級版,嚴格說不是標準冒泡,因為不滿足 相鄰兩兩比較 但是最簡單的交換排序 思路是每乙個數與它後面...

大話資料結構(二) 演算法

什麼是演算法呢?演算法是描述解決問題的方法。演算法 algorithm 這個單詞最早出現在波斯數學家阿勒 花刺子密在公元 825年 相當於我們中國的唐朝時期 所寫的 印度數字算術 中。如今普遍認可的對演算法的定義是 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示...