解题思路:

总思路简述:

从第二个数起,依次选取一个数,和其前面的数比较,把其前面的比它大的数后移,直到找到第一个小于等于它的数,或者它前面的所有数遍历完为止,再把该数插入。


1):设带排序数为 5 4 3 2 1

①:选取第二个数 4,5>4

5后移一位,这次排序结果为:4 5    3 2 1

②:选取第三个数3,5>3

5后移一位,再4>3,4后移一位,这次排序结果为3 4 5    2 1

③:选取第四个数2,5>2后移,4>2后移,3>2后移,这次排序结果为2 3 4 5     1

④:选取第五个数1,5>1后移,4>1后移,3>1后移,2>1后移,这次排序结果为1 2 3 4 5


void InsertSort(int R[],int n)
{
    /*从第二个数开始依次选取一个数*/
    int term;/*保存选取的数*/
    int j;/*保存选取的数的前一个数的下标*/
    for(int i=1;i<n;i++)
    {
        term=R[i];/*保存选取的数*/
        j=i-1;/*保存选取的数的前一个数的下标*/
         /*开始依次向前比较,term前所有数比较完或者找到一个比term小的数结束循环*/
         while(j>=0&&term<R[j])
         {
             /*每次比较比若R[j]比term大,R[j]后移一位*/
             R[j+1]=R[j];
             j--;
         }
         R[j+1]=term;
         /*这里为R[j+1]=term;j要加1,可以这样理解①:假设上面循环以j<0结束,那么此时j=-1,要插
         入的位置为第一个元素位置,即j+1=0号位置
         ②:若找到第一个小等于于term的数时结束循环:即不满足term<R[j]时,term插入的位置为R[j]后,
         故依旧是R[j+1]=term;*/
         
    }
}


参考代码:

#include<stdio.h>
#include<malloc.h>

void InsertSort(int R[],int n);
void input(int R[],int n);
void output(int R[],int n);

int main()
{
    int n;/*元素个数*/
    int *R;/*数组指针*/
    while(scanf("%d",&n)!=EOF)
    {
        R=(int *)malloc(n*sizeof(int));/*开辟空间*/
        /*输入数据*/
        input(R,n);
        /*插入排序*/
        InsertSort(R,n);
        /*输出数据*/
        output(R,n);
        /*释放空间*/
        free(R);
    }
 return 0;
}
/*------------------------------------------------------------*/
void InsertSort(int R[],int n)
{
    /*从第二个数开始依次选取一个数*/
    int term;/*保存选取的数*/
    int j;/*保存选取的数的前一个数的下标*/
    for(int i=1;i<n;i++)
    {
        term=R[i];/*保存选取的数*/
        j=i-1;/*保存选取的数的前一个数的下标*/
         /*开始依次向前比较,term前所有数比较完或者找到一个比term小的数结束循环*/
         while(j>=0&&term<R[j])
         {
             /*每次比较比若R[j]比term大,R[j]后移一位*/
             R[j+1]=R[j];
             j--;
         }
         R[j+1]=term;
    }
}
/*------------------------------------------------------------*/
void input(int R[],int n)
{
    for(int i=0;i<n;i++)
        scanf("%d",&R[i]);
}
/*------------------------------------------------------------*/
void output(int R[],int n)
{
    for(int i=0;i<n;i++)
        printf("%d ",R[i]);
    printf("\n");
}

别忘点赞哦-.-

点赞(4)
 

0.0分

6 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

HashMap 1年前 回复TA
#include<iostream>
using namespace std;
void Sort(int* nums, int n) {
	int i = 0, j = 0;
	for (i = 1; i < n; i++) {
		int x = nums[i];
		for (j = i - 1; j >= 0; --j) {
			if (nums[j] >= x) {
				nums[j + 1] = nums[j];
			}
			else
				break;
		}
		nums[j + 1] = x;
	}
}
int main()
{
  	
	int n;
	cin >> n;
	int* nums = new int[n];
	for (int i = 0; i < n; i++) {
		cin>> nums[i];
	}
	Sort(nums, n);
	for (int i = 0; i < n; i++) {
		cout << nums[i] << ' ';
	 }
}