插入排序有三种算法
1.直接插入排序
算法的思想比较简单,比如待排序序列 {5,4,6,2} ,进行从小到大排序,则从第一个元素开始,与其之前所有的元素进行比较
第一个5之前没有则还是 {5,4,6,2}
第二个4与5比较进行交换位置 {4,5,6,2}
第三个6与5比较,大于后不再进行比较,因为5之前已经有序(请注意思考为什么) 序列不 变{4,5,6,2}
第四个2需要与6,5,4都要比较 {2,4,5,6}
**对于刚才的提问,可以设想下一个待比较元素之前的元素都是有序的,所以只有更小才可能移动**
#include<stdio.h>
#define Max 8
void InsertSort(int sortArr[],int length) {
int i,j,temp;
for( i=0;i<length;++i) {
temp=sortArr[i];
for (j=i-1; j>=0 && sortArr[j]>temp; --j) {
sortArr[j+1]=sortArr[j];
}
sortArr[j+1]=temp;
}
}
void InsertSortAverse(int sortArr[],int length) {
int i,j,temp;
for( i=0;i<length;++i) {
temp=sortArr[i];
for (j=i-1; j>=0 && sortArr[j]<temp; --j) {
sortArr[j+1]=sortArr[j];
}
sortArr[j+1]=temp;
}
}
void display(int sortArr[],int length, char *p) {
printf("%s\n",p);
for (int i = 0; i < length; ++i)
{
printf("%d ", sortArr[i]);
}
printf("\n");
}
int main() {
int sortArr[Max]={ 8, 7, 5, 6, 1, 2, 3, 4};
InsertSort(sortArr, Max);
display(sortArr, Max, "elect sort is");
InsertSortAverse(sortArr, Max);
display(sortArr, Max, "decline sort is");
return 0;
}
2.折半插入排序
**算法思想与直接插入排序,不过进行之前比较的并不是顺序比较而不是折半比较**
折半比较的思想在查找那一章节有涉及
3.希尔排序
**希尔排序的思想与直接插入排序算法比较类似,不过多分了一些模块,不再次解释**