插入排序
基本思想:
每次将一个待排序的记录,按其关键 字大小插入到前面已经排好序的子
表 中的适当位置,直到全部记录插入完 成为止。
介绍两种插入排序方法 :
(1)直接插入排序(含二分插入排序)
(2)希尔排序
直接插入排序
1.假设待排序的记录存放在数组R[0..n-1]中
2.排序过程的某一中间时刻,R被划分成两个子区 间R[0..i-1]和R[i..n-1],其中
已排好序的,有序区
当前未排序的部分,称其为无序区
3.直接插入排序的基本操作是将当前无序区的第1 个记录R[i]插入到有序
区R[0..i-1]中适当的 位置上,使R[0..i]变为新的有序区。
4.直接插入排序每次使有序区增加1个记录,故常 称为增量法。
//直接插入排序
void insertsort(int a[], int n)
{
int i, j;
int temp;
for (i = 1; i < n; ++i)
{
temp = a[i];
j = i -1;
while (j >= 0 && temp < a[j])
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = temp;
}
}
//折半插入
void insertsort1(int a[], int n)
{
int i, j, low, high, mid;
int temp;
for (int i = 1; i < n; ++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 >= high + 1; j--)
a[j + 1] = a[j];
a[high + 1] = temp;
}
}
void main()
{
int a[] = { 15,2,0,9,4,5,6,7 };
int n = sizeof(a) / sizeof(int);
//insertsort(a, n);
insertsort1(a, n);
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << 1 / 2 << endl;
}