一、简单插入排序
1、代码
#include <stdio.h>
#include <stdlib.h>
#include "time.h"
#define N 20
void Init(int *arr);
void Output(int *arr);
void InsertSort(int *arr);
int Compare(int x, int y);
int main()
{
int arr[N+1];
Init(arr);
Output(arr);
InsertSort(arr);
Output(arr);
return 0;
}
//初始化
void Init(int *arr)
{
int i;
srand( (unsigned)time( NULL ) );
for(i = 1; i <= N; i++)
arr[i] = rand()%100;
}
//输出
void Output(int *arr)
{
int i;
for(i = 1; i <= N; i++)
printf("%2d ", arr[i]);
printf("\n");
}
//直接插入排序
void InsertSort(int *arr)
{
int i, j;
for(i = 2; i <= N; i++)
{
if (Compare(arr[i] ,arr[i-1]))
{
arr[0] = arr[i]; //复制为哨兵
for(j = i-1; Compare(arr[0], arr[j]); j--)
arr[j+1] = arr[j]; //记录后移
arr[j+1] = arr[0]; //插入
}
//Output(arr);
}
}
//比较函数
int Compare(int x, int y)
{
return x < y;
}
2、运行截图:
二、折半插入
1、代码
//折半插入排序
void BInsertSort(int * arr)
{
int i, j, low, high;
for (i = 2; i <= N; i++)
{
arr[0] = arr[i];
int low = 1, high = i - 1;
while(low <= high)
{
int m = (low + high) / 2; //折半
if(Compare(arr[0], arr[m])) //寻找插入点
high = m - 1; //插入点在前半区
else
low = m + 1; //插入点在后半区
}
for(j = i; j >= high + 1; j--) //记录后移
arr[j] = arr[j-1];
arr[j+1] = arr[0]; //插入
//Output(arr);
}
}
2、运行截图