定义:在一个有序的记录子集的基础上,每一步将下一个待排序的记录插入到已排好序的有序 记录子集中,直到将所有待排记录全部插入为止
常用的有四种:直接插入排序,折半插入排序,表插入排序,希尔排序
下面,我来介绍一下最常见的直接插入排序和折半插入排序
直接插入排序:
基本操作:将第i个记录插入到前面i-1个已排好序的记录中。
具体过程:将第i个记录的关键字Ki顺次与其前面的记录关键字Ki-1,Ki-2,…K1进行比较,将所有关键字大于Ki的记录依次向后 移动一个位置,直到遇见一个关键字小于或者等于Ki的记录Kj,此时Kj后面必为空位置,将第i个记录插入空位置即可。
例:
假设有一待排序列为:55 99 36 81 23 9 101 46 11 5
其中{}中存放已经排好的序列
其过程为:
**{ 55 } 99 36 81 23 9 101 46 11 5
**{ 55 99 } 36 81 23 9 101 46 11 5
**{ 36 55 99 } 81 23 9 101 46 11 5
**{ 36 55 81 99 } 23 9 101 46 11 5
**{ 23 36 55 81 99 } 9 101 46 11 5
**{ 9 23 36 55 81 99 } 101 46 11 5
**{ 9 23 36 55 81 99 101 } 46 11 5
**{ 9 23 36 46 55 81 99 101 } 11 5
**{ 9 11 23 36 46 55 81 99 101 } 5
**{ 5 9 11 23 36 46 55 81 99 101 }
如此,即完成了该序列的排序
其代码如下:
#include<stdio.h>
#include<windows.h>
void Insert_Sort(int *a,int num)
{
int i, j;
int temp;
for (i = 1; i < num; i++) {
temp = a[i]; //将待插入的值存入temp中
for (j = i; j >= 0; j--) {
if (a[j - 1] > temp) {
a[j] = a[j - 1]; //后移
}
else {
a[j] = temp; //插入
break;
}
}
}
}
void Print(int *a,int num)
{
int i;
for (i = 0; i < num; i++){
printf("%d ", a[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 48, 62, 35, 77, 55, 14, 35, 98 };
int len = sizeof(arr) / sizeof(arr[0]);
Insert_Sort(arr, len);
Print(arr, len);
system("pause");
return 0;
}
--------------------------------------------------------------------------------------------------------------------------------------------
折半插入排序:
用折半查找法确定待排序序列,r[i]在有序记录序列r[1...i-1]中的位置
#include<stdio.h>
#include<windows.h>
void Print(int *a,int num)
{
int i;
for (i = 0; i < num; i++){
printf("%d ", a[i]);
}
printf("\n");
}
void Bin_Sort(int *a, int num)
{
int i, j;
int low, high, mid;
int temp;
for (i = 1; i < num; i++){
temp = a[i]; //待插入的元素
low = 0;
high = i - 1;
while (low <= high){
mid = (low + high) / 2; //折半
if (temp < a[mid]){
high = mid - 1;
}
else{
low = mid + 1;
}
}
for (j = i - 1; j >= low; j--){
a[j + 1] = a[j];
a[j] = temp;
}
}
}
int main()
{
int arr[] = { 48, 62, 35, 77, 55, 14, 35, 98 };
int len = sizeof(arr) / sizeof(arr[0]);
Bin_Sort(arr, len);
Print(arr, len);
system("pause");
return 0;
}
____________________________________________________________________________________________________
THE END