//
// main.cpp
// Sorting
//
// Created by barry_yan on 12-12-6.
// Copyright (c) 2012年 barry_yan. All rights reserved.
/*直接插入排序
空间 它只需要一个辅助空间
最少比较次数 n-1 正序
最大比较次数 (n+2)(n-1)/2 逆序 此时最大移动次数为 (n+4)(n-1)/2
综上 平均比较次数和移动记录数约为n^2/4 时间复杂度为o(n^2)
*/
#include <iostream>
using namespace std;
int input_array(intconst *p)
{
printf("please input the array numbers......\n");
for (uint i =0; i <10;i++)
{
scanf("%d",p++);
}
return0;
}
int output_array(intconst *p)
{
for (uint i =0; i <10;i++)
{
printf("%d\t",*(p++) );
}
return0;
}
/直接插入排序
int Straight_Insertion_sort(int *a,int n)
{
uint i =0, j =0;
int temp =0;
for(i =1; i < n; ++i)
{
temp = a[i];
for (j = i; j >0 && temp < a[j -1]; j--) //精髓是从后向前比较
{
a[j] = a[j -1];
}
a[j] = temp;
}
//其实这里想了想还有比较好的方法可以减少比较的次数,但移动的次数不变!那就是比较的时候进行折半查找
//换句话说就是利用有序表进行折半查找再插入。原先的是比较一次移动一下,现在是直接定位然后一次性移动。
printf("Straight Insertion sort\n");
return0;
}
int main(int argc,constchar * argv[])
{
int array[10] = {0};
input_array(array);
Straight_Insertion_sort(array,sizeof(array)/sizeof(int));
output_array(array);
return 0;
}
///输出
please input the array numbers......
12
23
34
45
56
65
54
43
32
21
Straight Insertion sort
12 212332344345545665
//提交时文本编译有问题,排版不是这样的。大家试一下!