排序演算法(nlogn級)

2021-09-26 01:31:22 字數 1461 閱讀 2319

歸併排序

//merge()函式是合併兩個有序序列,使用了two pointers的思想,可以看看演算法筆記上的記錄

//將陣列a的[l1,r1]與[l2,r2]區間合併成有序區間(此處l2即為 r1+1)

const

int max=

100;

void

merge

(t a,

int l1,

int r1,

int l2,

int r2)

else

}while

(i<=r1)

while

(j<=r2)

for( i =

0; i < index; i++)}

//將a陣列當前區間[left,right]進行歸併排序

//遞迴演算法

void

mergesort

(t a,

int left,

int right)

}

快速排序

//此處用以劃分區間的主元是 a[left] ;

//必須滿足主元左邊的元素都要比主元小,右邊的元素比主元大

//對區間[left,right]進行劃分

intpartition

(t a,

int left,

int right)

a[left]

=a[right]

;//將a[right]移至a[left]處

while

(left<=temp)

a[right]

=a[left]

;//將a[left]移至a[right]處

} a[left]

=temp;

//把temp放到 left和 right相遇的地方

return left;

//返回相遇的下標

}//快速排序對於接近有序的序列,會達到最壞時間複雜度,所以使用以下方法優化區間劃分

//優化的快速排序—隨機快排

//隨機選取主元,對區間[left,right]進行劃分

intrandpartition

(t a,

int left,

int right)

a[left]

=a[right]

;while

(left>=temp)

a[right]

=a[left]

; a[left]

=temp;

return left;}}

//快速排序,left和right初值為序列下標首尾(例如1與 n)

//遞迴演算法

void

quicksort

(t a,

int left,

int right)

}

nlogn排序 快速排序

快速排序的基本思想也比較清楚,首先找出乙個基準位置,該基準位置可以是陣列中的任何乙個元素,通常我們指定第乙個元素。每一次快速排序我們會將該基準位置上的元素放到最終它應該在的位置。即它左邊的所有元素都小於基準元素,它右邊的所有元素都大於基準元素。function quicksort arr funct...

高階級排序演算法

希爾排序 void shellsort int array,int len o n n 希爾排序關鍵思想先分組,再分別插入排序 array k temp while gap 1 迴圈條件,當gap 1時,恢復至插入排序 選gap的方式現在仍然是計算機界乙個大問題,目前的選擇都是根據大量工程實踐而來 ...

複雜度nlog n 之快速排序

快速排序是利用分治和遞迴的思想進行的排序演算法,每一次都將第乙個元素置於它在陣列中應該的位置 前面的數字比它小,後面的數字比它大 然後就把此數的前半段和後半段重複前面的操作。核心思想就是利用了乙個paration這個函式。平均時間複雜度 最好時間複雜度 最壞時間複雜度 空間複雜度 nlog n nl...