O lgn 的三種排序,快速排序 歸併排序 堆排序

2021-06-22 01:51:16 字數 1228 閱讀 7567

快速排序:

取某個數作為中間數來進行比較,不斷的交換陣列中的兩個數,分成小於中間數和大於中間數的兩個分組,再對分組做快速排序(也就是用遞迴的思想)

歸併排序:

從中間把陣列分成兩部分,每部分都進行一次歸併排序(遞迴),然後再使用merge把這兩部分已排完序的陣列合併成順序陣列。

堆排序:

1、保持堆特性:左右兩子樹都為最大堆,只有父節點可能不滿足,於是遞迴的進行保持最大堆特性的運算(也就是不滿足就和子樹換,換完繼續對子樹進行保持對特性)

2、建堆:利用1中的函式,從葉子的父節點開始到根節點進行保持對特性的運算,從而達到建堆。

3、排序:由於建堆完成之後,根節點一定是最大值,因此不斷的把根節點和葉子交換,並且減少陣列大小。

**附上:

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

void quicksort(int *vec, int beg, int end)

} swap(vec, mid, end);

quicksort(vec, beg, mid - 1);

quicksort(vec, mid+1, end); }}

void merge(int *vec, int p, int q, int end)

for(int i = 0; i < n2; ++i)

int l_beg = 0;

int r_beg = 0;

for(int i = p; i <= end; ++i)

else if(r_beg == n2)

if(l[l_beg] < r[r_beg])

vec[i] = l[l_beg++];

else

vec[i] = r[r_beg++]; }}

void mergesort(int *vec,int beg, int end)

}//root = 0;

//parent(i) = (i+1)/2-1;

//left(i) = 2*i+1;

//right(i) = 2*(i+1);

void maxheap(int vec,int n, int index)

} else if(index * 2 + 1 == n)

} }void buildheap(int vec, int n)

}void heapsort(int vec, int n)

}

三種排序演算法 歸併排序 快速排序,堆排序

歸併排序 建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序演算法穩定,陣列需要o n 的...

三種快速排序

3種快排的實現方式,1是不適合重複元素多,2可以適應重複元素多,3可以優化重複元素多的時間 author hxj 2020年7月27日 public class main int l 0,r arr.length 1 quicksort arr,l,r private static void qui...

三種快速排序以及快速排序的優化

1 快速排序的基本思想 快速排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。2 快速排序的三個步驟 1 選擇基準 在待排序列中,按照某種方式挑出乙個元素,作為 基準 pivot 2...