目錄
一、插入排序(直接插入排序、折半插入排序、希爾排序)
二、交換排序(冒泡、快排)
三、選擇排序
四、歸併排序
五、基數排序(桶排序)
六、總結見下表
基本思想:每次將乙個待排序的記錄按其關鍵字大小插入到前面已排好序的子串行中,直到全部記錄插入完成。
1.直接插入排序:
有序序列l[1...i-1]
l(i)
無序序列l[i+1...n]
簡單來說,就是從有序序列中找到l(i)可以插入的位置k,將l(i)臨時存放到temp中》temp=l(i),然後l[k...i-1]依次後移到[k+1,i]覆蓋。i的範圍是[2,n]。
void insertsort(elementtype a,int n)
a[j+1]=a[0];//j+1而不是j,因為迴圈最後一次j-1了}}
}
最好情況下序列是排好序的,只需查詢位置,不用移動元素,最好時間複雜度為o(n),平均時間複雜度o(n^2),空間複雜度o(1),穩定排序。
2.折半插入排序:
在直接插入排序中做了兩個工作。
(1)查詢插入位置 (2)移動元素騰位置。
顯然查詢插入位置可以使用二分法進行優化(第二個工作不變),**如下:
void insertsort(elementtype a,int n)
for(int j=i-1;j>=high+1;j--)
a[high+1]=a[0];}}
減少了比較元素的次數,變成了o(nlog2n),但是移動複雜度未變,所以時間複雜度仍未o(n^2)。
1.氣泡排序
氣泡排序的思想是:
從後向前兩兩比較相鄰元素的值,若為逆序(即a[i-1]>a[i]),則交換他們,直到序列比較完。我們稱它為第一趟冒泡,結果是將最小的元素交換到待排序的第乙個位置。下一趟冒泡時,前一趟確定的最小元素不再參與。這樣最多n-1趟氣泡排序就能把所有元素排好序。
void bubblesort(elementtype a,int n)
}void headadjust(elementtype a,int k,int len)
} a[k]=a[0];
} //排序過程
void heapsort(elementtype a,int len)
}
空間複雜度o(1),時間複雜度o(nlog2n),不穩定排序
將兩個或兩個以上的有序表組合成乙個新的有序表。假設n個有序的子表,每個字表的長度為1,然後兩兩合併,得到n/2個長度為2或1的有序表;繼續兩兩合併,,,如此重複,直到合成乙個長度為n的有序表為止。
void merge(elementtype a,int low,int mid,int high)
for(int i=low,j=mid+1,k=i;i<=mid&&j<=high;k++)else a[k]=b[j++];
} while(i<=mid)a[k++]=b[i++];
while(j<=high)a[k++]=b[j++];
} void mergesort(elementtype a,int low,int high){
if(low空間複雜度o(n),時間複雜度o(nlog2n),穩定排序。
借助多關鍵字排序的思想對單邏輯關鍵字進行排序。
例如:
排序演算法複習
參考自 直接插入排序 從小到大排列 n個資料,第乙個資料平凡有序 假設前i 1個資料串有序,根據第i個的大小將第i個插入到此串中,則前i個的資料串也有序。因此可得到n個資料有序。插入方法 待插入元素為第i元素,數值存為temp,將 i 之前的元素 j 從第 i 1 元素開始與之比較 如果比temp大...
演算法複習 排序
排序中主要有插入排序 氣泡排序 歸併排序 快速排序等 主要從空間消耗 時間複雜度 最差時間複雜度等方面考慮演算法的好處 1.插入排序 插入排序是一種簡單直觀的排序演算法。它的工作原理非常類似於我們抓撲克牌 對於未排序資料 右手抓到的牌 在已排序序列 左手已經排好序的手牌 中從後向前掃瞄,找到相應位置...
演算法複習 排序
穩定的排序 排序之後,源資料中相同的資料相對位置不會發生改變 不穩定的排序 反之。test array 12,10,1,5,10 foreach test as val for i 0 i test i bin test222,58,0,count test222 1 function bin da...