排序方法
平均最好
最壞輔助空間
穩定性冒泡
o(n2)
o(n)
o(n2)
o(1)
穩定簡單選擇
o(n2)
o(n2)
o(n2)
o(1)
穩定插入
o(n2)
o(n)
o(n2)
o(1)
穩定希爾
o(nlogn)~o(n2)
o(n1.3)
o(n2)
o(1)
不穩定堆排序
o(nlogn)
o(nlogn)
o(nlogn)
o(1)
不穩定歸併
o(nlogn)
o(nlogn)
o(nlogn)
o(n)
穩定快速
o(nlogn)
o(nlogn)
o(n2)
o( logn) ~o(n)
不穩定氣泡排序:
void bubblesort(list *l)}}}
簡單選擇排序(效能略優於冒泡)
通過n-i次比較,選擇最小的和目標i交換
//簡單排序
void selectsort(list *l)
if (min != i)
swap(l, i, min);
}}
插入排序
基於有序的假設插入,比較後,資料右移,填空
//插入排序,基於有序的事實,資料右移,插入
void insertionsort(int a,int n)
}
堆排序
建立堆(根、子節點,下濾),根與堆末尾交換,調整堆
特點:非常穩定 o(nlogn),相比於希爾排序慢(移動資料進行兩次比較)
//堆排序 ,先建立堆,讓堆的首尾交換,重新建立堆
#define leftchild (i) (2*i+1)
void percdown(int *a, int i, int n)
if (a[child] > a[i])
a[i] = a[child];
else
break;
} a[i] = tmp;
}void heapsort(int *a, int n)
}
歸併排序
分治 、 遞迴、 宣告乙個臨時變數tmparray,避免遞迴佔空間,
很難用於主存排序,o(nlogn),合併是外部排序的中心思想。
void merge(int *a, int * tmparray, int lpos, int rpos, int rend)//命名是否幫助理解
else
}while (lpos <= leftend)
while (rpos <= rend)
for (int i = 0; i < rend - lpos + 1; i++, rend--) }
void msort(int *a, int * tmparray, int left, int right) }
void mergesort(int *a, int n)
else
}
希爾
o(n7/6) 最壞 o(n4/3)
快排
幾種排序方法
一 選擇排序 原理 1 依次比較陣列中元素,從而記錄下陣列中最小的元素 2 將最小元素與陣列第乙個元素交換 3 依次比較陣列中剩餘元素,從而記錄下剩餘陣列中最小的元素 與陣列第二個元素交換,以此類推 特點 需要大約 n 1 n 2 1 n 2 2次比較和n次交換,演算法的時間效率取決於比較的次數。i...
java幾種排序 方法
1 氣泡排序 bubble sort 最簡單的排序方法是氣泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。...
javascript 的幾種排序方法
所謂排序,就是要整理檔案中的記錄,使之按關鍵字遞增 或遞減 次序排列起來。其確切定義如下 輸入 n個記錄r1,r2,rn,其相應的關鍵字分別為k1,k2,kn。輸出 ril,ri2,rin,使得ki1 ki2 kin。或ki1 ki2 kin 這裡,我們簡單介紹幾種排序方法,直接插入排序 希兒排序 ...