一.直接插入排序
時間複雜度:O(n2)
空間複雜度:O(1)
示例代碼:
#include<iostream>
#include<string.h>
using namespace std;
#define LENGTH(s) (sizeof(s) / sizeof(int))
void insertsort_zhijie(int a[]){//將亂序數組遞增排列
int i,j,k;
for(i=1;i<10;i++){
k=a[i];
j=i-1;
while(j>=0&&k<a[j]){//如果k小於a[j]的話,需要將k放到a[j]的前面
a[j+1]=a[j];
j--;
}
a[j+1]=k;
}
};
int main(){
int a[]={9,1,2,3,6,4,5,0,8,7};
insertsort_zhijie(a);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
}
分析:將數組分爲有序區和無序區,開始的時候有序區只有a[0],即第一個元素,然後從無序區開頭的元素一個 一個的往有序區排。數組中相同的元素在排完序後順序不變,爲穩定排序。
二.折半插入排序
時間複雜度:O(n2)
空間複雜度:O(1)
示例代碼:
#include<iostream>
#include<string.h>
using namespace std;
#define LENGTH(s) (sizeof(s) / sizeof(int))
void insertsort_zheban(int a[]){//將亂序數組遞增排列
int i,j,k,low,high,mid;
for(i=1;i<10;i++){
k=a[i];
low=0;high=i-1;
while(low<=high){//折半查找找到插入位置high+1
mid=(low+high)/2;
if(k<a[mid]){
high=mid-1;
}else{
low=mid+1;
}
}
for(j=i-1;j>=high+1;j--){//把high+1與i-1之間的元素後移一個
a[j+1]=a[j];
}
a[high+1]=k;//插入
}
}
int main(){
int a[]={9,1,2,3,6,4,5,0,8,7};
//int a[]={1,2,3,4,5,6,7,8,9,0};
insertsort_zheban(a);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
}
分析:先通過折半查找的方式,找到無序區首元素應該插入的位置high+1,然後將high+1到i-1的元素後移。穩定的排序算法。
三.希爾排序
時間複雜度:是gap序列的函數,但一般認爲是O(n1.3)
空間複雜度:O(1)
#include<iostream>
#include<string.h>
using namespace std;
#define LENGTH(s) (sizeof(s) / sizeof(int))
void shellsort(int a[]){//將亂序數組遞增排列
int i,j,k,gap;
gap=10/2;//此處取gap(增量)的初始值爲數組長度的一半,以後依次取gap的一半。
while(gap>0){//採用直接插入排序
for(i=gap;i<10;i++){
k=a[i];
j=i-gap;
while(j>=0&&k<a[j]){
a[j+gap]=a[j];
j=j-gap;
}
a[j+gap]=k;
}
gap=gap/2;
}
}
int main(){
int a[]={9,1,2,3,6,4,5,0,8,7};
//int a[]={1,2,3,4,5,6,7,8,9,0};
shellsort(a);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
}
分析:對間隔爲增量gap的元素進行排序,知道進行到最後一次才形成有序。不穩定的排序算法。