1. 理解排序做的工作:
排序的过程是一个逐步扩大记录的有序序列长度的过程,
在排序的过程中可以将排序区分为两个区域:
有序序列区 和 无需序列区
有序序列区: 已经排好序的序列
无序序列区: 尚未排好序的序列
我们所要做的工作就是: 把有序序列区一点一点增大直到长度变为最大为止,无需序列区一点点减少直到减为0位置
2.直接插入排序 的实质就是:把数组的前半部分看成有序序列区,数组的后半部分看成无序序列区
从无序序列区从左到右每次取一个元素和 有序序列区中的元素进行比较(遍历),如果比它小就交换
3.少啰嗦直接上代码
#include<stdio.h>
//交换两个变量
void swap(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
int main(int argc, char const *argv[])
{
int a[]={1,3,2,2,4,23,6,5,7,9,8};
for(int i=1;i<sizeof(a) / sizeof(a[0]);i++){//待排序的数组,
for(int j=0;j<i;j++){//已经排好序的数组,让第一层待排序的数组和这层排好序的数组比较,如果小于已排序中的那一个就和它交换
if(a[i]<a[j]){
swap(&a[i],&a[j]);
}
}
}
for(int i=0;i<sizeof(a) / sizeof(a[0]);i++){
printf("%d,",a[i]);
}
getchar();
return 0;
}
4.运行结果
5. 封装: 把insertSort 函数从main 中抽离出来:
#include<stdio.h>
//交换两个变量
void swap(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
//遍历一个数组
void iterator(int a[],int length){
for(int i=0;i<length;i++){
printf("%d,",a[i]);
}
}
//插入排序,由于c语言中没有办法使用 引用,所以这里我给他传入了一个数组的长度
void insertSort(int *a,int length){
for(int i=1;i<length;i++){//待排序的数组,
for(int j=0;j<i;j++){//已经排好序的数组,让第一层待排序的数组和这层排好序的数组比较,如果小于已排序中的那一个就和它交换
if(a[i]<a[j]){
swap(&a[i],&a[j]);
}
}
}
}
int main(int argc, char const *argv[])
{
int a[]={1,3,2,2,4,23,6,5,7,9,8};
insertSort(a,sizeof(a)/sizeof(a[0]));
iterator(a,sizeof(a)/sizeof(a[0]));
// for(int i=0;i<sizeof(a) / sizeof(a[0]);i++){
// printf("%d,",a[i]);
// }
getchar();
return 0;
}
封装后运行结果: