直接插入排序:
把数组划分为左右两个区域,有序区和无序区,开始有序区只有一个元素,就是数组最左边的元素。
每次取得无序区第一个元素x,从有序区最右边的值开始到最左边,把比x大得元素都往后移动一个位置,直到找到一个不大于x的位置,或者到了最左边(即有序区所有元素都比x大,x应该插入到最前面),停下来的位置就是插入元素x的位置。
下面这里为什么是 a[j+1]=t ?
因为如果是因为j>=0不满足循环而退出,也就是j=-1,此时应该把元素保存在a[0]也就是a[j+1]
对于如果是不满足a[j]>t而退出循环,那么此时a[j]位置的元素是小于等于t的,而原来a[j+1]的位置的元素是大于t的,且已经被往后移动了一个位置,那么a[j+1]就应该是放t的位置。
这里用[5 4 2 3 1]模拟下过程
[5][4 2 3 1]
[4 5][2 3 1]
[2 4 5][3 1]
[2 3 4 5][1]
[1 2 3 4 5][]
#include"array.h"
void isort(int a[],int n){
int i,j;
for(i=1;i<n;i++){
int t=a[i];
for(j=i-1;j>=0&&a[j]>t;j--)
a[j+1]=a[j];
a[j+1]=t;
}
}
void isort1(int a[],int n)
{
for(int i=1;i<n;i++)
for(int j=i-1;j>=0&&a[j]>a[j+1];j--)
swap(a[j+1],a[j]);
}
int main()
{
int a[10];
getRandArray(a,10);
print(a,10);
isort(a,10);
print(a,10);
}