資料結構 排序演算法總結

2021-08-14 15:11:53 字數 2511 閱讀 9018

1、二路歸併排序

/** 二路歸併排序

* 思路:利用分治思想,對原陣列進行二分分段,使元素在每一小段內有序,然後逐漸合併

* 如,最小分段是2,先2內有序,合併為4,4內有序。。。。

** 時間複雜度:o(nlogn)

* 空間複雜度:o(n)需要乙個額外的陣列作為臨時儲存

*/static void mergesort(int array, int helper, int left, int right)

while (helperleft <= mid && helperright <= right)

while (helperleft <= mid)

array[cur++] = helper[helperleft++];

}2、快速排序

/** 快速排序

* 思路:先選擇乙個哨兵元素,然後後往前遍歷,遇到比哨兵小的元素停止,從前往後進行遍歷,

* 遇到比哨兵元素大的元素停止,交換兩個元素,繼續,直到前後相遇,此時交換相遇點的元素

* 和哨兵元素,一趟排序下來,可以確保哨兵元素左邊的元素比哨兵小,右邊的元素比哨兵大(公升序排序);

* 然後分區間再繼續上述過程

* 注意:通常選取左邊界作為哨兵元素,此時,必定先進行從後往前的移動,否則不對稱缺項會出錯

** 時間複雜度:平均o(nlogn) 最差o(n^2)

* 空間複雜度:o(logn)交換時需要乙個額外的空間,一共交換logn次

*/static void quicksort(int array, int left, int right)

}array[left] = array[i];

array[i] = pivot;

quicksort(array, left, i - 1);

quicksort(array, i + 1, right);

}3、堆排序

/** 堆排序

*///調整堆,larger=true大頂堆,否則為小頂堆

static void adjustheap(int array, int parent, int length, bool large) else

//把孩子節點的值賦給父節點

array[parent] = array[child];

//選取孩子節點的左孩子節點,繼續向下篩選

parent = child;

child = child * 2 + 1;

array[parent] = pivot; }}

/** 初始化堆

* 調整之後,第乙個元素為序列的極值

*/static void buildheap(int array, int length, bool large)

/** 初次建堆時間複雜度o(n)

* 調整一次的時間為o(logn),一共調整n次

* 時間複雜度為o(nlogn)

* 空間複雜度o(1)

*/static void heapsort(int array, int length, bool increase) else

buildheap(array, length, large);

print(array, length);

//將極值逐漸放到隊尾,剩下元素重新調整

for (int i = length - 1; i > 0; i--)

}4、直接插入排序

/** 直接插入排序

* 思路:由第二個元素開始,從前向後遍歷,如若當前元素比前乙個元素小,則將

* 當前元素設為哨兵元素,儲存當前元素,從當前位置向前掃瞄,尋找哨兵元素應該插入的位置,

* 前面的元素依次後移,找到直接插入。然後繼續上述過程

* 時間複雜度:o(n^2)

* 空間複雜度:o(1)

*/static void directinsertsort(int array, int length)

array[j + 1] = pivot;}}

}5、希爾排序

/** shell排序(縮小增量排序)

* 思路:以一定間隔對陣列進行分組,在組上進行直接插入排序,使之有序,之後縮小間隔,

* 重複上述過程

* 時間複雜度:o(n^1.5)

* 空間複雜度:o(1)

*/static void shellsort(int array, int length)

array[j + gap] = x;}}

print(array, length);

gap /= 2;}}

6、氣泡排序

/** 氣泡排序

* 思路:每次內迴圈使相鄰元素有序,單次迴圈後最大值沉底(公升序時)

* 之後縮短內迴圈範圍,繼續上述操作,但是 有個問題,太冗雜

* 時間複雜度:o(n^2)

* 空間複雜度:o(1)

*/static void bubblesort(int array, int length)

}print(array, length);}}

資料結構排序演算法總結

常用的演算法有插入排序 氣泡排序 選擇排序 快速排序 歸併排序 希爾排序 堆排序 計數排序和基數排序。下面對著九種常見排序方法進行總結 排序方法 時間複雜度 空間複雜度 個人評價 插入排序 o n 2 o 1 選擇排序 氣泡排序 希爾排序 o n log n 快速排序 o log n 歸併排序 o ...

資料結構 排序演算法總結

def bubblesort array flag false length len array for i in range length for j in range length i 1 if array j array j 1 temp array j array j array j 1 a...

資料結構 排序演算法總結

1.排序 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。2.穩定性 假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r i r j 且r i 在r j 之前,而在排序後的序列中,r i 仍在r ...