八大内部排序
八大排序
前言
排序,就是重新排列表中的元素,使得表中元素滿足按關(guān)鍵字有序的過(guò)程。
排序有許多種,常用的八大內(nèi)部排序?yàn)槊芭菖判颉⒉迦肱判颉⑦x擇排序、希爾排序、快速排序、歸并排序、基數(shù)排序、堆排序
這幾種排序沒(méi)有絕對(duì)的優(yōu)劣,每種排序都有他們適用范圍
?
一、冒泡排序
冒泡排序每一趟排序可以確定一個(gè)元素的最終位置,若一次掃描并沒(méi)有元素進(jìn)行交換,則說(shuō)明表已有序。
void bubbleSort(ElemType a[], int n){for(int i = 0; i < n - 1; i++){bool flag = false;for(int j = n - 1; j > i; j--){if(a[j] < a[j - 1]){swap(a[j], a[j - 1]);flag = true;}}if(flag == false){return;}} }冒泡排序的性能分析:空間效率為O(1),最壞時(shí)間復(fù)雜度為O(),平均時(shí)間復(fù)雜度為O()。
二、插入排序
插入排序的基本思想是將一個(gè)未排序的表,按照關(guān)鍵字大小插入到前面已經(jīng)排好序的子序列(表)中,直到表中所有元素插入完成。
void insertSort(ElemType a[], int n){int i, j;for(int i = 2; i <= n; i++){if(a[i] < a[i-1]){a[0] = a[i];for(j = i - 1; a[0] < a[j]; --j)a[j+1] = a[j]a[j+1] = a[0];}} }性能分析,插入排序的空間復(fù)雜度為O(1),時(shí)間復(fù)雜度為O()
三、希爾排序
希爾排序的基本思想是先將待排序的表分割成若干個(gè)特殊子表,每個(gè)子表的元素在主表中間隔n個(gè)元素,并將間隔量稱為增量,然后對(duì)各個(gè)子表進(jìn)行插入排序,當(dāng)整個(gè)表中的元素基本有序,再對(duì)全體記錄進(jìn)行一次插入排序
void shellSort(ElemType a[], int n){for(int dk = n/2; dk >= 1; dk = dk/2){for(int i = dk + 1; i <= n; i++){if(a[i] < a[i - dk]){a[0] = a[i];for(int j = i - dk; j > 0 && a[0] < a[j]; j -= dk){a[j+dk] = a[j];}a[j+dk] = a[0]; }}} }性能分析:空間復(fù)雜度為O(1),時(shí)間復(fù)雜度為O(),最壞情況為O()
四、快速排序
快速排序的基本思想是分治,在待排序的表中隨機(jī)選取一個(gè)元素pivot作為樞紐(基準(zhǔn)),經(jīng)過(guò)一次排序后,樞紐左邊的元素均小于樞紐,樞紐右邊的元素均大于樞紐,即樞紐確定其在有序表的最終位置,這樣的一次過(guò)程稱為一趟快排,或叫一次劃分。
int partition(ElemType a[], int lo, int hi){int pivot = a[lo];while(lo < hi){while(lo < hi && a[hi] >= pivot) --hi;a[lo] = a[hi];while(lo < hi && a[lo] <= pivot) ++lo;a[hi] = a[lo];}a[lo] = pivot;return lo; } void quickSort(ElemType a[], int lo, int hi){if(lo < hi){int pivot = partition(a, lo, hi);quickSort(a, lo, pivot - 1);quickSort(a, pivot + 1, hi);} }性能分析:空間效率,快排遞歸需要借助遞歸工作棧來(lái)保存每層遞歸的信息,其容量和遞歸的最大深度一致。時(shí)間效率,最好情況,快排的最壞情況發(fā)生在兩個(gè)區(qū)域分別包含n-1個(gè)元素和0個(gè)元素時(shí),這種極大程度的不對(duì)稱性若發(fā)生在每次遞歸中,即對(duì)應(yīng)的表基本有序或基本逆序,則最壞情況的時(shí)間復(fù)雜度為。
總結(jié)
?
總結(jié)
- 上一篇: 基于MATLAB语音LPC参数,实验4基
- 下一篇: 好饭不怕晚,加油。