本部分内容参考了:https://www.cnblogs.com/chenglc/p/7880029.html
摘抄的源码做了一下修改
排序法按照存储分为:内部排序法,外部排序法。
内部排序法分为:插入排序法,选择排序法,交换排序法,归并排序法,基数排序法。
插入排序法分为:直接插入排序法,希尔排序法
选择排序法分为:简答排序法和堆排序法
交换排序法分为:冒泡排序法和快速排序法。
今天讨论插入排序法:
一、直接排序法
升序排序
思路:如果a[i]比a[k]小,则本次不排序,进行下一次循环。如果a[i]比a[k]大,则a[k]插入到a[i]的位置a[i]及其之后的元素后移一位
要点:记录a[i]的临时值,和i值以及数组边界
源码如下:
#include <stdio.h>
void print(int *iarry,int n,int i);
void InsertSort(int a[],int n){
for (int i =1 ;i<n;i++)
{
if ( a[i] < a[i-1]){
int j=i-1;
int x = a[i];
while ( x < a[j] )
{
a[j+1] = a[j];
j--;
if ( j < 0 )
break;
}
a[j+1]=x;
}
print(a,n,i);
}
}
void print(int *iarry,int n,int i){
for ( int j=0;j<n;j++)
{
printf("%d ",iarry[j]);
}
printf("\n");
}
int main(){
int iarry[10]={8,1,4,9,5,3,6,7,2,0};
InsertSort(iarry,10);
print(iarry,10,10);
return 0;
}
直插法降序:
#include <stdio.h>
void print(int *iarry,int n,int i);
void InsertSort(int a[],int n){
for (int i =1 ;i<n;i++)
{
if ( a[i] > a[i-1]){
int j=i-1;
int x = a[i];
while ( x > a[j] )
{
a[j+1] = a[j];
j--;
if ( j < 0)
break;
}
a[j+1]=x;
}
print(a,n,i);
}
}
void print(int *iarry,int n,int i){
for ( int j=0;j<n;j++)
{
printf("%d ",iarry[j]);
}
printf("\n");
}
int main(){
int iarry[10]={1,8,4,9,5,3,6,7,2,0};
InsertSort(iarry,10);
print(iarry,10,10);
return 0;
}