代码改变世界

基于递归的插入排序

  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 }
复制代码
编辑推荐:
· 基于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最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示