基于递归的插入排序
2012-03-09 12:54 youxin 阅读(3543) 评论(0) 编辑 收藏 举报
插入排序类似玩扑克牌,每次把抽到的牌插入到已排好序的牌中,使之大小有序。
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
设数组为a[0…n-1]。
1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1
2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。
3. i++并重复第二步直到i==n-1。排序完成。
下面给出严格按照定义书写的代码(由小到大排序):
void Insertsort1(int a[], int n) { int i, j, k; for (i = 1; i < n; i++) { //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置 for (j = i - 1; j >= 0; j--) if (a[j] < a[i]) break; //如找到了一个合适的位置 if (j != i - 1) { //将比a[i]大的数据向后移 int temp = a[i]; for (k = i - 1; k > j; k--) a[k + 1] = a[k]; //将a[i]放到正确位置上 a[k + 1] = temp; } } }
这样的代码太长了,不够清晰。现在进行一下改写,将搜索和数据后移这二个步骤合并。即每次a[i]先和前面一个数据a[i-1]比较,如果a[i] > a[i-1]说明a[0…i]也是有序的,无须调整。否则就令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据a[j]<a[i]时停止并将temp放到a[j + 1]处。
void Insertsort2(int a[], int n) { int i, j; for (i = 1; i < n; i++) if (a[i] < a[i - 1]) { int temp = a[i]; for (j = i - 1; j >= 0 && a[j] > temp; j--) a[j + 1] = a[j]; a[j + 1] = temp; } }
再对将a[j]插入到前面a[0…j-1]的有序区间所用的方法进行改写,用数据交换代替数据后移。如果a[j]前一个数据a[j-1] > a[j],就交换a[j]和a[j-1],再j--直到a[j-1] <= a[j]。这样也可以实现将一个新数据新并入到有序区间。
void Insertsort3(int a[], int n) { int i, j; for (i = 1; i < n; i++) for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--) Swap(a[j], a[j + 1]); }
转自:
http://blog.csdn.net/morewindows/article/details/6665714
#include<stdio.h> void Insert(int *a,int n)//把数组a的第n个数插入前n-1个数中,注意前n-1个数已经是排好序的了 { int i=n-1; int key=a[n]; while((i>=0)&&(key<a[i])) { a[i+1]=a[i]; i--; } a[i+1]=key; return; } void InsertionSort(int *a,int n)//递归插入,跟求阶乘的思想一样,前n-1个排好序的数组,是建立在前n-2个排好序的数组的基础上插出来的 { if(n>0) { InsertionSort(a,n-1); Insert(a,n); } else return; } void main() { int i,n,a[30]; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } InsertionSort(a,n-1); for(i=0;i<n;i++) { printf("%d ",a[i]); } return; }
//把x插入数组中 void insertNum(int *a, int n) { int key = a[n - 1]; int i; for (i = n - 2; i >= 0 && a[i] > key; i--) a[i + 1] = a[i]; a[i + 1] = key; } void recurInsertSort2(int *a, int n) { if (n > 1) { recurInsertSort2(a, n - 1); insertNum(a, n); } }
1 #include "iostream"
2 using namespace std;
3 //基于递归插入排序算法
4 void RecursionInsert(int A[],int n)
5 {
6 int k;
7 int a;
8 n = n-1;
9 if(n>0)
10 {
11 RecursionInsert(A,n);
12 a = A[n];
13 k = n-1;
14 while((k>=0) && (A[k]>a))
15 {
16 A[k+1] = A[k];
17 k = k-1;
18 }
19 A[k+1] = a;
20 }
21
22 }
23 int main(int argc, char* argv[])
24 {
25 int Array[20];
26 int ArraySize;
27 cout<<"请输入数组的个数:"<<endl;
28 cin>>ArraySize;
29 cout<<"请输入数组元素,元素之间用空格隔开(最多不得超过20个元素)"<<endl;
30 for(int i = 0;i<ArraySize;i++)
31 cin>>Array[i];
32 RecursionInsert(Array,ArraySize);
33 for(int j=0;j<ArraySize;j++)
34 cout<<Array[j]<<'\t';
35 return 0;
36 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通