原题链接:数据结构-直接插入排序
解题思路:
总思路简述:
从第二个数起,依次选取一个数,和其前面的数比较,把其前面的比它大的数后移,直到找到第一个小于等于它的数,或者它前面的所有数遍历完为止,再把该数插入。
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");
}别忘点赞哦-.-
0.0分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#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] << ' '; } }