【插入排序】
数组前k-1个元素已经有序,如何确定第k个元素的插入位置,使得这k个元素有序。
方法1:从左到右扫描扫描这个有序子数组,直到遇到第一个大于等于A[k]的元素,然后把A[k]插在这个元素的前面。
方法2:从右到左扫描这个有序子数组,直到遇到第一个小于等于A[k]的元素,然后把A[k]插在这个元素的后面。
【希尔排序】
先将数组分组,分别对每组进行插入排序,依次减少分组数进行插入排序,最后对分组数为1,即对整个数组进行插入排序。
【代码】
#include <stdio.h>
#include <stdlib.h>
void InsertionSort(int a[], int n)
{
int i, j;
int tmp;
for(i = 1; i < n; i++)//方法2的插入方式
{
tmp = a[i];
j = i - 1;
while ( j >= 0 && a[j] > tmp)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = tmp;
}
}
void ShellSort(int a[], int n)
{
int step;
int i, j, k;
int tmp;
for(step = n / 2; step > 0; step /= 2) //不同步长的分组
for(k = 0; k < step; k ++) //总共分成step组
for(i = k + step; i < n; i+=step) //对每组进行插入排序
{
tmp = a[i];
j = i - step;
while(j >= 0 && a[j] > tmp)
{
a[j + step] = a[j];
j = j - step;
}
a[j + step] =tmp;
}
}
int main(void)
{
int a[7] = {5, 7, 3, 0, 4, 9, 8 };
int n = sizeof(a)/sizeof(int);
InsertionSort(a, n);
ShellSort(a, n);
for(int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}原文地址:http://blog.csdn.net/asdfghjkl1993/article/details/24603307