一、各個排序演算法的過程:
1、直插入排序:乙個個的進行插入,直到有序序列。穩定的。 要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。
具體實現**如下: 時間複雜度:o(n^2).
void insertsort(int a, int n)
}
3、選擇排序:按大小順序一次選出,進行公升降排列。 在要排序的一組數中,選出最小(或者最大)的一
個數與第1個位置的數交換;
然後在剩下的數當中再找最小(或者最大)的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後
乙個數)比較為止。
/**
* 陣列的最小值
* * @return int 陣列的鍵值
*/
int selectminkey(int a, int n, int i)
return k;
}
/**
* 選擇排序
* */
void selectsort(int a, int n)
print(a, n , i); //列印每趟排序的結果
}
}
4、堆排序:序是一種樹形選擇排序,建大(小)頂堆,輸出對頂元素,調整堆,迴圈進行 。
堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後乙個元素交換位置。
/**
* 已知h[s…m]除了h[s] 外均滿足堆的定義
* 調整h[s],使其成為大頂堆.即將對第s個結點為根的子樹篩選,
* * @param h是待調整的堆陣列
* @param s是待調整的陣列元素的位置
* @param length是陣列的長度
* */
void heapadjust(int h,int s, int length)
/**
* 堆排序演算法
*/
void heapsort(int h,int length)
}
5、氣泡排序
/交換:相鄰互換,大底小冒。 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
void bubblesort(int a, int n)
} }
}
6、快速排序:迴圈利用基準分割兩塊,一前一後指標,比較大小,交換基準與它的位置。
void swap(int *a, int *b)
int partition(int a, int low, int high)
print(a,10);
return low;
}
void quicksort(int a, int low, int high)
}
7、歸併排序:不斷合併有序列
//將r[i…m]和r[m +1 …n]歸併到輔助陣列rf[i…n]
void merge(elemtype *r,elemtype *rf, int i, int m, int n)
while(i <= m) rf[k++] = r[i++];
while(j <= n) rf[k++] = r[j++];
}
8、基數排序:資料分組,組內排序。
是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。基數排序基於分別排序,分別收集,所以是穩定的。
二、排序演算法之間的對比:用於直接解題和記憶
最好最壞時間複雜度一致的表明對序列的初始排序沒有影響。
三、拓撲排序演算法
由aov
網構造拓撲序列的拓撲排序演算法主要是迴圈執行以下兩步,直到不存在入度為
0的頂點為止。
(1)選擇乙個入度為
0的頂點並輸出之;
(2)從網中刪除此頂點及所有出邊。
迴圈結束後,若輸出的頂點數小於網中的頂點數,則輸出「有
迴路」資訊,否則輸出的頂點序列就是一種拓撲序列。
將其區別於圖的深度優先遍歷和廣度優先遍歷序列。
8大排序總結
include includeusing namespace std void select sort vector a 選擇排序 非穩定 void bubble sort vector a 氣泡排序 void insert sort vector a 插入排序 有序最快 void shell so...
8大排序整理
2.選擇排序 3.插入排序 4.歸併排序 5.基數排序 最快平均 最慢空間複雜度 穩定性複雜性 o n o n2 o n2 o 1 穩定簡單 氣泡排序是一種用時間換空間的排序方法 最壞情況是把順序的排列變成逆序,或者把逆序的數列變成順序,最差時間複雜度o n 2 只是表示其操作次數的數量級。最好的情...
九大排序演算法
常見的排序分為兩類,一類是內部排序 直接插入排序 希爾排序 簡單選擇排序 堆排序 氣泡排序 快速排序 歸併排序 基數排序 一類是外部排序。當n較大時,應該使用時間複雜度為o nlog2n 的排序,如快速排序 堆排序 歸併排序。快排是基於比較的內部排序中,最好的方法。假設陣列為r 0 r n 1 第一...