資料結構排序演算法

2021-08-21 18:22:14 字數 2882 閱讀 7041

排序:就是將一組雜亂無章的資料按照一定的規律組織起來。

按照大類分為穩定排序和不穩定排序。穩定排序就是指兩個大小相同的順序在排序之後順序不變,而不穩定排序那就不一定了。

快速排序、希爾排序、堆排序、直接選擇排序不是穩定的排序演算法。

詳細**如下:

//在這裡:n(log2n)是指log以2為底n的對數

穩定排序的適用條件:1.本來就有序 2.陣列比較短

在這篇部落格中會詳細講到七種排序演算法,具體的過程在**中以注釋的形式體現:

1.氣泡排序:

兩層迴圈,相鄰元素進行比較

void bubblesort(int array, int size)

//迴圈套迴圈,大迴圈遍歷亂序的陣列,小迴圈在裡面進行交換。

//有序區間逐漸變長,無序區間逐漸變短。

int bound = 0;

//[0,bound)當前的有序區間 [bound,size)亂序排序

for (; bound < size; ++bound)

}return;

}

下面是測試**以及主函式,經過除錯結果無誤:

void testbubblesort() ;

bubblesort(array, sizeof(array) / sizeof(array[0]));

//列印陣列元素的函式也是提前寫好的,直接呼叫就可以

printarray(array, sizeof(array) / sizeof(array[0]));

}int main()

2.選擇排序:

打擂台的思想,和氣泡排序十分相似,都是兩層迴圈,但實際比較不一樣

void selectsort(int arr, int size)

//首先搭建出來乙個有序區間

int bound = 0;

for (; bound < size; ++bound)

} return;

}

3.插入排序:

(線性表)分成有序區間(0,bound)和待排序區間[bound,size},將後面的元素嘗試插入有序線性表的合理位置。類似撲克牌洗牌的過程。移動的都是位置,而不是具體的數值。

void insertsort(int arr, int size)

//將bound位置的元素插入到前面線性表的合理位置

int bound = 0;

for (; bound < size; ++bound)

else

} arr[i] = bound_value;//當i等於0時,迴圈退出

}}

4.堆排序(公升序用大堆、降序用小堆)其重點在於堆的建立和刪除

(1)建立大堆(上浮式 從前往後遍歷、下沉式  需要從後往前遍歷);

(2)迴圈刪除堆頂元素(1、將堆頂根結點和末尾元素進行交換,此時末尾就是最大值,2、重新調整堆結構,再次調整堆頂元素和末尾元素,3、不斷重複此步驟,直至滿足堆的性質,變得有序)

void adjustdown(int arr, int size, int index)//然後和父節點進行比較

if (arr[child]>arr[parent])

else

parent = child;//作為新的起始節點

child = 2 * parent + 1;

} return;

}void heapcreate(int arr, int size)

//下沉式調整,從最後乙個非葉子節點往前遍歷

//size-1就是最後乙個元素的下標

int i = (size - 1 - 1) / 2;//當前元素的父節點

for (; i >= 0; --i)

} if (size <= 1)

//交換堆頂元素和末尾元素

swap(&arr[0], &arr[size - 1]);

down(arr, size - 1, 0);

}void heapsort(int arr, int size)

// 1. 建立大堆,呼叫函式

heapcreate(arr, size);

// 2. 迴圈刪除堆頂元素

// 每次刪除乙個元素, 就把當前的最大值放到陣列末尾了

int i = 0;

for (; i < size; ++i)

}

5.希爾(shell)排序:(以人名命名的一種演算法),一種改進版本的插入排序

思路:將資料分組,每一組再進行插入排序

gap步長即是組數,組內排序成功,再依次交替組成乙個新的陣列(插入排序)

下列情況效果比較好:長度n  步長n/2,n/4,n/8...1

void shellsort(int arr, int size)

int gap = size / 2;

for (; gap >= 1; gap /= 2)

else

}arr[i] = bound_value;

} }return;

}

6.歸併排序(merger):分治思想,利用遞迴和迭代演算法

物件導向:兩個有序的陣列

思路:申請乙個可以放下兩個陣列的空間,對於兩個陣列的開頭設定兩個指標,比較指標所指向的數字大小,小的直接放入新的陣列,指標順應後移。

7.快排:找到乙個基準值

第乙個下標從前往後遍歷,嘗試找到第乙個大於基準值的元素,第二個下標從後往前遍歷,嘗試找到第乙個小於基準值的元素,相同就交換位置。

資料結構 排序演算法

include include define maxitem 100 typedef char keytype 5 typedef int elemtype typedef struct rec elemnode maxitem 氣泡排序演算法 void bubblesort elemnode r,...

資料結構 排序演算法

排序演算法分為內部排序和外部排序兩大類。內部排序 在計算機記憶體中完成的排序演算法 外部排序 不能再記憶體中文完成,必須在磁碟或者磁帶上完成的排序演算法 內部排序是研究的重點問題,通常我們講的八大排序演算法也主要是講的內部排序演算法。排序演算法的穩定性和時間空間複雜度 本文重點介紹以下幾種排序演算法...

資料結構 排序演算法

直接插入排序是指將r i r n 插入到已經有序的r 1 r i 1 序列中。r 0 是乙個哨兵,起到作為邊界條件並作為暫存單元的作用。實際上,一切為簡化邊界條件而引入的附加節點 元素 均可稱為哨兵。例如單鏈表中的頭結點。對於有n個記錄的集合,要進行n 1趟排序。其最優時間複雜度是o n 平均時間複...