排序演算法整理

2021-08-16 05:39:35 字數 3039 閱讀 7637

先把常用排序演算法進行分類:

插入排序

直接插入排序、折半插入排序、希爾排序

交換排序

氣泡排序、快速排序

選擇排序

簡單選擇排序、堆排序

歸併排序

基數排序

下面我們乙個乙個來看:

1.直接插入排序

進行n-1趟排序,每趟把乙個元素插入到前面已經排好序的序列中,其時間複雜度為o(n²),並且由於判斷要插入的條件是《而不是<=,所以這是穩定的演算法

public

void

insertsort(int a, int n)

a[j] = temp;

break;}}

}}

2.折半插入排序

進行n-1趟排序,每趟排序在查詢插入位置的時候用到了折半查詢法,所以總的查詢時間複雜度為o(nlog₂n),但由於移動元素的時間複雜度沒有變,所以此演算法的時間複雜度仍為o(n²),同時它也是乙個穩定的排序演算法

public void binaryinsertsort(int a, int n) 

if (a[mid] < a[i])

if (a[mid] == a[i])

}int temp = a[i];

if (a[mid] <= temp)

a[mid + 1] = temp;

}if (a[mid] > temp)

a[mid] = temp;}}

}

3.希爾排序

步長d=n/2,步長相同的元素為一組,分別在組內進行直接插入排序,然後d=d/2,再進行上述步驟……直到d=1,此時元素已經基本有序,然後再總體進行一次直接插入排序,這樣元素移動次數會小一些。最壞情況下,時間複雜度為o(n²)。當相同關鍵字的元素被劃分到不同組時,可能改變它們的順序,所以該演算法是不穩定的

public

void

shellsort(int a, int n)

a[k] = temp;

break;}}

j += d;}}

d /= 2;

}}

4.氣泡排序

進行n-1趟排序,從前往後通過兩兩交換把大的元素移到後面,這樣每一趟都會有乙個元素被放到正確的位置上,時間複雜度為o(n²),是穩定的演算法

public

void

bubblesort(int a, int n) }}

}

5.快速排序

利用了分治思想,每趟排序以序列中第乙個元素為基準,將比它小和比它大的元素分別劃分到它的兩邊,這樣基準元素就放在了正確的位置上。遞迴地對它的左右兩個序列繼續進行排序,最後所有元素就都有序了。平均情況下時間複雜度為o(nlog₂n),當元素基本有序時會出現最壞情況,時間複雜度為o(n²)。其空間複雜度最壞情況下為o(n),平均情況下為o(log₂n)。在交換區間的過程中相同關鍵字元素的順序可能會發生變化,所以它是不穩定的。

public void quicksort(int a, int low, int high) 

a[low] = temp;

quicksort(a, templow, low - 1);

quicksort(a, low + 1, temphigh);

}}

6.簡單選擇排序

進行n-1趟排序,每次從剩餘序列中選擇乙個最小的與當前位置上的元素交換,時間複雜度為o(n²),在交換位置的過程中可能會改變相同大小元素的相對順序,所以是不穩定的演算法

public void selectsort(int a, int n)

}a[minindex] = a[i];

a[i] = min;

}

7.堆排序

將所有非葉結點進行一次向下調整,建立大根堆,然後不斷把堆頂元素與堆底元素交換位置,堆容量減一,向下調整堆頂元素,則每次都有乙個元素放到正確位置上,當堆容量變為1時排序完成,時間複雜度為o(nlog₂n),因為靠前的元素反而先被輸出到後面,所以是不穩定的演算法

//堆排序

public

void

heapsort(int a, int n)

}//建立大根堆

public

void

buildmaxheap(int a, int n)

}//向下調整

public

void

adjustdown(int a, int k, int n)

}}

8.歸併排序

遞迴劃分,直到每組只剩下乙個元素,重點是合併演算法,注意是將兩個有序序列合併,用到了輔助陣列,二路歸併排序時間複雜度為o(nlog₂n),因為合併演算法不改變相同大小元素的相對順序,所以為穩定演算法

//歸併排序

public

void

mergesort(int a, int low, int high)

}//合併操作

public

void

merge(int a, int low, int mid, int high) else

}while(i <= mid)b[k++] = a[i++];

while(j <= high)b[k++] = a[j++];

i = low;

j = 1;

while(i <= high)

}

9.基數排序

r為最大基數,d為位數,借助r+1個佇列,從後往前進行d趟排序,時間複雜度為o(d(n+r)),為穩定演算法

public

void

radixsort(int a, int r, int d, int n)

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

for (int j = 0, k = 1; j <= r; j++) }}

}

排序 排序演算法整理

經常零零散散的用到排序演算法,將幾類常見的總結下來 時間複雜度o n 2 空間複雜度o 1 穩定排序 param arr public static void insersort int arr else arr j 1 tmp 氣泡排序 時間複雜度 o n 2 空間複雜度o 1 穩定排序 para...

排序演算法整理

template void cinsertsort mysort function compare template void cselectsort mysort function compare swap datas i datas id void cshellsort mysort funct...

排序演算法整理

2.後移元素,空出插入位置 插入位置下標為low或high 1 for j i 1 j low j 3.插入元素 此時low high 1 a low current 與直接插入排序相比,減少了元素的比較次數。每次迴圈,都是先找到插入位置,再來移動元素,而不是比較一次移動乙個元素。一次迴圈比較log...