纯手撸——直接插入排序
数据结构复习的最后一章节,给自己个小目标一礼拜内完纯手撸完考纲必考排序的代码,保持独立思考。
首先是直接插入排序,顺一遍步骤:
- 假设给定数组(整型)第一个元素有序
- 从第二个元素开始,与自己左边的第一个元素比较,如果比自己小,则不动;如果比自己大,就与自己左边的第二个元素比较;直到遇到不比自己大的元素,在其右边插入
- 选取后面的元素,依次重复第二步
#include<stdio.h>
//后面为了测试写的输出,输出每一次排序后的信息。这是后面补上的,方便观察,必须放在InsertSort方法前
void print(int a[], int n ,int i){
printf("%d:",i);
for(int j=0; j<8; j++){ //这里可自行修改
printf("%d",a[j]);
}
printf("\n");
}
//直接插入排序
void InsertSort(int a[],int n){ //a为要排序的数组,n为元素总个数 (即长度)
for(int i=1;i<n;i++){ //默认第一个元素有序,故i从地址下标1处开始循环
if(a[i]<a[i-1]){ //第i个元素大于i-1元素,不动;反之,要找适当位置插入
int j=i-1; //j指向i的左边第一个元素
int tmp=a[i]; //临时存储待插入元素
while(j>-1&&tmp<a[j]){ //找要插入的位置
a[j+1]=a[j]; //数组元素后移一个位置,这是为了给待插入元素腾出位置
j--;
}
a[j+1]=tmp; //插入正确的位置,即最后比较不比自己大的元素的右边
}
print(a,n,i);//打印每次排序后的结果
}
}
//测试
int main(){
int a[8]={3,1,7,5,2,4,9,6}; //预计 1 2 3 4 5 6 7 9
InsertSort(a,8);
}
复盘一下:
void InsertSort(int a[],int n)
{
for(int i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
int j=i-1;
int tmp=a[i];
for (;j>0&&tmp<a[i];j--)
{
a[j+1]=a[j]; //后移
}
a[j+1]=tmp; //插入
}
}
}