先给一个例题:先给定一个数n,后面紧接着输入n个数,要求把这些数由小到大排列起来。
这道题其实很简单,用很多种排序方法都可以做出来,今天刚把插入排序参透了,所以用插入排序来做做看。
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n,a[60],flag,m;
scanf("%d",&n); //首先输入一个数
for(int i=0;i<n;i++) //从键盘上输入n个数
scanf("%d",&a[i]);
for(int i=1;i<n;i++)
{
m=i-1;
flag=a[i]; //设置的目标数
while(m>=0&&a[m]>flag) //代码的核心,这个在下面解释
{
a[m+1]=a[m];
m--;
}
a[m+1]=flag; //最后将目标数换到比它小的数之前
}
for(int i=0;i<n;i++) //以此输出所有数
printf("%d ",a[i]);
return 0;
}
现在解释代码的核心,我们可以举例一串数:3 2 1 6 5
比如说我们的目标数 flag==2,m==0,此时的a[m]==3>flag,可以进行交换,所以进入循环,将前面的值赋给后面,这个时候不用担心后面的值被覆盖,因为此时后面一个(目标数)已经被flag记录下来了,此时a[0]==3,a[1]==3,此时m--,m<0,跳出循环,将目标数赋给比它小的数之前,a[0]==2,程序继续跑,i==2,m==1,此时的目标数flag==1,此时的进入循环,察觉到目标数的前面一个比它要大,所以前面的数往后移,覆盖后面的数,a[0]==2,a[1]==3,a[2]==3,m--,m此时变成了0,此时前面的数还是比目标数flag要大,所以继续进行循环,a[0]==2,a[1]==2,a[2]==3,m--,m此时变成了-1.不满足循环条件,跳出循环,再用目标数将a[0]覆盖a[0]==1,此时a[0]==1,a[1]==2,a[2]==3,一直用这个程序跑,就可以排序。
初学C,望大佬们指教!