插入排序(Insert sort)
1.排序思想
设有一组关键字{K1, K2,…, Kn};排序开始就认为 K1 是一个有序序列;让 K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 Kn 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。
具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤 2~5
2.Python实现
##Insert sort
##python3
##Yanglin Tu
def insert_sort(unsort_list):
length = len(unsort_list)
for i in range(length-1):
key = unsort_list[i+1]
j = i
while unsort_list[j] > key and j >= 0:
unsort_list[j+1] = unsort_list[j]
j -= 1
unsort_list[j+1] = key
return unsort_list
def main():
list_a = [20, 5, 7, 1, 66, 47, 5, 18]
print(list_a)
sort_list = insert_sort(list_a)
print(sort_list)
if __name__ == '__main__':
main()
3.C++实现
//Insert sort
//c++
//Yanglin Tu
#include <iostream>
using namespace std;
void insert_sort(int *arr, int length);
int main()
{
int i;
int list_a[] = {20, 5, 7, 1, 66, 47, 5, 18};
int length = sizeof(list_a)/sizeof(int);
for(i=0; i<length; i++)
cout<<list_a[i]<<'\t';
cout<<endl;
insert_sort(list_a,length);
for(i=0; i<length; i++)
cout<<list_a[i]<<'\t';
cout<<endl;
return 0;
}
void insert_sort(int *arr,int length)
{
int i,j;
for(i=1; i<length; i++)
{
int key = arr[i];
j = i-1;
while(j>=0 && arr[j]>key)
{
arr[j+1] = arr[j];
j -= 1;
}
arr[j+1] = key;
}
}
4.性能分析
插入排序的平均时间复杂度为O(),空间复杂度为O(1), 是个稳定的排序算法。