直接插入排序(递归与非递归2种实现方法)
2014-09-30 06:58
337 查看
一个数组有n个元素,假如前面n-1个元素已经排序好了,那么把第n个元素插入到前面n-1个元素,使得数组有序排列,就是插入排序了。
至于n-1个元素如何已经先排序好,那么我们可以假设前面n-2个元素已经排序好,把第n-1个元素插入到前面n-2个元素。
依次类推,直到只剩下一个元素,也就是第一个元素。排序完成。
代码如下:
附上递归版本的写法
时间复杂度分析:
1.最好情况下,原始数据已经排序好,那么时间复杂度为O(N)
2.最坏的情况下,原始数组反向排序,此时为O(n²)
3平均情况下,O(n²)
元素数据在越接近有序的情况下,直接插入的效率越高。
至于n-1个元素如何已经先排序好,那么我们可以假设前面n-2个元素已经排序好,把第n-1个元素插入到前面n-2个元素。
依次类推,直到只剩下一个元素,也就是第一个元素。排序完成。
代码如下:
#include<iostream> using namespace std; void Insert_Sort(int *A,int n) { int i,j,a; for(i=0;i<n-1;i++) { j=i+1; a=A[j]; while(a<A[j-1]) { A[j]=A[j-1]; j--; } A[j]=a; } } void main() { int A[4]={21,2,34,1}; Insert_Sort(A,4); for (int i=0;i<4;i++) { cout<<A[i]<<endl; } system("pause"); }
附上递归版本的写法
#include<iostream> using namespace std; //把n插入前面已经排序好的数组 void Insert(int *a,int n) { int i=n-1; int key=a ; while((i>=0)&&key<a[i]) { a[i+1]=a[i]; i--; } a[i+1]=key; } void Insert_Sort(int *A,int n) { if(n>0) { Insert_Sort(A,n-1); //递归表示前面已经排序好 Insert(A,n); } else //递归的出口是n=0 return ; } void main() { int A[4]={21,2,34,1}; Insert_Sort(A,3); for (int i=0;i<4;i++) { cout<<A[i]<<endl; } system("pause"); }
时间复杂度分析:
1.最好情况下,原始数据已经排序好,那么时间复杂度为O(N)
2.最坏的情况下,原始数组反向排序,此时为O(n²)
3平均情况下,O(n²)
元素数据在越接近有序的情况下,直接插入的效率越高。
相关文章推荐
- 直接插入排序的实现(递归和非递归)
- 直接插入排序的四种实现方法
- Java程序实现冒泡排序、直接排序、插入排序方法
- mips程序设计——直接插入排序的递归与非递归实现(spim模拟)
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- 直接插入排序的C++实现及随机数组的产生方法
- 直接插入排序的递归与非递归实现
- 递归排序的一种实现方法。
- 白话经典算法系列之二 直接插入排序的三种实现
- 数据结构--直接插入排序实现
- 每天学习一算法系列(35)(递归和非递归俩种方法实现二叉树的前序遍历)
- 插入排序之直接插入排序(java实现)
- 经典排序算法-MFC实现之4:直接插入排序
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
- 直接插入排序的三种实现
- 用JAVA实现排序算法之二:直接插入排序
- 直接插入排序(C++模版技术实现)
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- c++ 模板实现 -- 直接插入排序和归并排序
- C语言实现直接插入排序