/**
*直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
*设数组为unsorted[0…n-1]。
*1. 初始时,unsorted[0]自成1个有序区,无序区为unsorted[1..n-1]。令i=1
*2. 将unsorted[i]并入当前的有序区unsorted[0…i-1]中形成unsorted[0…i]的有序区间。
*3. i++并重复第二步直到i==n-1。排序完成。
*/
//低级
void insertion_sort_low(int unsorted[], int count)
{
int i, j, k;
for (i = 1; i < count; i++) {
//为unsorted[i]在前面的unsorted[0...i-1]有序区间中找一个合适的位置
for (j = i - 1; j >= 0; j--) {
if (unsorted[j] < unsorted[i])
break;
}
//如找到了一个合适的位置
if (j != i - 1) {
//将比unsorted[i]大的数据向后移
int temp = unsorted[i];
for (k = i - 1; k > j; k--) {
unsorted[k + 1] = unsorted[k];
}
//将unsorted[i]放到正确位置上, (j+1)
unsorted[k + 1] = temp;
}
}
}
//中级 精简。现在进行一下改写,将搜索和数据后移这二个步骤合并。即每次unsorted[i]先和前面一个数据unsorted[i-1]比较,如果unsorted[i] > unsorted[i-1]说明unsorted[0…i]也是有序的,无须调整。否则就令j=i-1,temp=unsorted[i]。然后一边将数据unsorted[j]向后移动一边向前搜索,当有数据unsorted[j]<unsorted[i]时停止并将temp放到unsorted[j + 1]处。
void insertion_sort_middle(int unsorted[], int count)
{
int i, j;
for (i = 1; i < count; i++) {
if (unsorted[i] < unsorted[i - 1]) {
int temp = unsorted[i];
for (j = i - 1; j >= 0 && unsorted[j] > temp; j--)
unsorted[j + 1] = unsorted[j];
unsorted[j + 1] = temp;
}
}
}
//高级 更精简 再对将unsorted[j]插入到前面unsorted[0…j-1]的有序区间所用的方法进行改写,用数据交换代替数据后移。如果unsorted[j]前一个数据unsorted[j-1] > unsorted[j],就交换unsorted[j]和unsorted[j-1],再j--直到unsorted[j-1] <= unsorted[j]。这样也可以实现将一个新数据新并入到有序区间。
void insertion_sort_high(int unsorted[], int count)
{
for (int i = 1; i < count; i++) { //初始时,unsorted[0]自成1个有序区,无序区为unsorted[1..n-1]。令i=1
for (int j = i-1; j>=0 && unsorted[j] > unsorted[j+1]; j--) { //将unsorted[i]并入当前的有序区unsorted[0…i-1]中形成unsorted[0…i]的有序区间。
swap(&unsorted[j], &unsorted[j + 1]);
}
}
}
int main(int argc, const char * argv[])
{
int unsorted[] = { 6, 2, 4, 1, 5, 3, 7, 8, 9, 10, 11};
//selection_sort(x, 11);
//bubble_sort_low(unsorted, 11);
//bubble_sort_middle(unsorted, 11);
//bubble_sort_high(unsorted, 11);
//insertion_sort_low(unsorted, 11);
//insertion_sort_middle(unsorted, 11);
insertion_sort_high(unsorted, 11);
for (int index = 0; index<11; index++) {
printf("%d ",unsorted[index]);
}
printf("\n");
}
原文地址:http://blog.csdn.net/majiakun1/article/details/36876479