一、插入排序
插入排序的原理是它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,
找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),
因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间
二、插入排序的步骤
1、从第一个元素开始,该元素可以认为已经被排序
2、取出下一个元素,在已经排序的元素序列中从后向前扫描
3、如果该元素(已排序)大于新元素,将该元素移到下一位置
4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5、将新元素插入到该位置后
6、重复步骤2~5
三、选择排序的特点
1、所需时间取决于输入的初始序列顺序
2、最好情况下(已经有序),需要比较N-1次,最坏需要比较N(n-1)/2次
3、最好情况下需要交换0次交换,N(n-1)/2交换
4、插入排序是稳定的排序算法
四、代码
#include <iostream>
using namespace std;
template <typename type>
void Exch(type& a, type& b)
{
type temp = a;
a = b;
b = temp;
}
template <typename type>
void InsertSort(type data[], int length)
{
int j, i;
for (i = 1; i < length; i++)
{
//data[i] 默认有序,取出数组的下一个元素为新元素
//在已经排序的序列中从后向前扫描,已经有序的范围是data[0...i-1]
//如果新元素小于当前元素,当前元素向后移动
//继续上一步骤,直到当前元素小于等于新元素
int temp = data[i];
for (j = i - 1; j >= 0 && data[j] > temp; j--)
data[j + 1] = data[j];//当前元素向后移动
//直到当前元素小于等于新元素,跳出for循环
//将新元素放到该位置
data[j + 1] = temp;
}
}
template <typename type>
void PrintList(type data[], int length)
{
for (int i = 0; i < length; i++)
cout << data[i] << "\t";
}
int main()
{
int a[] = { 1, 3, 2, 4, 5, 7, 6, 8, 0, 9 };
InsertSort(a, 10);
PrintList(a, 10);
return 0;
}
python
#coding=gbk
'''
Created on 2015年5月12日
@author: Nicholas
'''
class Sort():
def InsertSort(self,data):
for i in range(1,len(data)):
j=i-1
temp = data[i]
while(j>=0 and temp<data[j]):
data[j+1] =data[j]
j -= 1
data[j+1] = temp
def PrintData(self,data):
for e in data:
print(e)
if __name__ == '__main__':
data=[1,0,9,2,3,8,6,7,4,5]
s = Sort()
s.InsertSort(data)
s.PrintData(data)