一直接插入排序
直接插入排序是個穩(wěn)定的排序算法,適用于關鍵碼n較小,在已知關鍵碼基本有序情況(最好的情況,時間復雜度為0(n),只比較元素n-1次,不移動元素),最壞的情況下時間復雜度為0(n^2),比較元素次數(shù)為n(n-1)/2,移動元素次數(shù)為(n+3)(n -2)/2,空間復雜度為0(1)
下面實現(xiàn)直接插入排序(遞增序列)
#include <stdio.h>
#include <stdlib.h>
void insertSort(int *data,int n){
int j, temp;
for(int i = 1;i <n;i++){
// 比較 n-1趟
if(data[i-1] > data[i]){
temp = data[i];
data[i] = data[i -1];
// 移動元素
for(j = i - 2;j >= 0 && data[j] > temp;j--) data[j + 1] = data[j];
data[j + 1] = temp;
}
}
}
int main(int argc ,char *argv[]){
int data[] = {3,2,4,5};
insertSort(data,4);
for(int i = 0;i < 4;i++){
printf("%d ",data[i]);
}
return 0;
}
2 冒泡排序
冒泡排序也是一個穩(wěn)定的排序,在待排關鍵碼基本有序的情況下,只需要(n-1)次比較,不需要交換元素(O(n),1趟排序),關鍵碼逆序的情況下,需要n(n-1)/2次比較,關鍵碼n(n -1)/2次交換(O(n^2),n-1趟排序)
冒泡排序的實現(xiàn)(遞增序列):
#include <stdio.h>
#include <stdlib.h>
void bubbleSort(int *data,int n){
int temp;
int tag = 1; // 是否交換元素
//最多n-1趟
for(int i = 1; i< n && tag;i++){
tag = 0;
for(int j = 0; j < n -i; j++){
if(data[j] > data[j+1]){
temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
tag = 1;
}
}
}
}
int main(int argc, char *argv[]){
int data[] = {10,8,11,9};
bubbleSort(data,4);
for(int i= 0 ; i < 4 ;i++){
printf("%d ",data[i]);
}
return 0;
}
總結
直接插入排序和冒泡排序,時間復雜度和空間復雜度相同,但直接插入排序關鍵碼移動次數(shù)明顯比冒泡排序少,實際應用直接插入排序更加有效,更廣.