一、简单插入排序
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、运行截图

本文详细介绍了插入排序的两种实现方式:简单插入排序和折半插入排序。简单插入排序通过比较将元素逐个插入已排序部分,而折半插入排序则通过二分查找减少比较次数。文章提供了相应的代码实现,并展示了折半插入排序的运行截图。
224

被折叠的 条评论
为什么被折叠?



