先把常用排序演算法進行分類:
插入排序
直接插入排序、折半插入排序、希爾排序
交換排序
氣泡排序、快速排序
選擇排序
簡單選擇排序、堆排序
歸併排序
基數排序
下面我們乙個乙個來看:
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...