/*插入排序 : 对于每次遍历,发现新加的数大于排在后面的数,则往前遍历,然后把跳过的数往后移位;
SQ——2014 04 14
*/
#include<stdio.h>
void swap(int * aa , int * bb);
void insert(int cc[] ,int n);
int main()
{
int aa =10;
int bb= 5;
printf("aa=%d bb= %d" ,aa,bb);
swap(&aa ,&bb);
printf("aa=%d bb= %d" ,aa,bb);
//--------------test _2!--------------------
int cc[10] ={10,8,9,7,6,4,5,3,2,1};
int i;
for (i =0; i< (sizeof(cc)/sizeof(cc[0])); i++)
printf(" %d \n" ,cc[i]);
insert(cc ,10);
printf("after insert!\n");
for (i =0; i< (sizeof(cc)/sizeof(cc[0])); i++)
printf(" %d \n" ,cc[i]);
return 0;
}
void insert( int a[] ,int n){
int i,j,key;
for (i=0; i <n; i++) { //就是每次都将新加入的数据与后面的数开始比较
for(j = i ; j >0 ;j --) {
if (a[j] < a[j-1]) { //如果新加的数 > 数组的最后一个,那么就将数组最后一个后移一位。
swap(&a[j] ,&a[j-1]);
}
}
}
}
void swap(int * aa , int * bb){
//传递过来的是指针,所以你对指针进行改动是没有意义的。
int tmp;
tmp = *aa;
*aa = *bb;
*bb = tmp;
SQ——2014 04 14
*/
#include<stdio.h>
void swap(int * aa , int * bb);
void insert(int cc[] ,int n);
int main()
{
int aa =10;
int bb= 5;
printf("aa=%d bb= %d" ,aa,bb);
swap(&aa ,&bb);
printf("aa=%d bb= %d" ,aa,bb);
//--------------test _2!--------------------
int cc[10] ={10,8,9,7,6,4,5,3,2,1};
int i;
for (i =0; i< (sizeof(cc)/sizeof(cc[0])); i++)
printf(" %d \n" ,cc[i]);
insert(cc ,10);
printf("after insert!\n");
for (i =0; i< (sizeof(cc)/sizeof(cc[0])); i++)
printf(" %d \n" ,cc[i]);
return 0;
}
void insert( int a[] ,int n){
int i,j,key;
for (i=0; i <n; i++) { //就是每次都将新加入的数据与后面的数开始比较
for(j = i ; j >0 ;j --) {
if (a[j] < a[j-1]) { //如果新加的数 > 数组的最后一个,那么就将数组最后一个后移一位。
swap(&a[j] ,&a[j-1]);
}
}
}
}
void swap(int * aa , int * bb){
//传递过来的是指针,所以你对指针进行改动是没有意义的。
int tmp;
tmp = *aa;
*aa = *bb;
*bb = tmp;
}
那么有什么可以改进的方法呢? 这里只是每次插入都是从最后的一个数开始比较,其实如果用二分的话来查找插入点的话似乎更好。
但是时间复杂度还是为0(n2);
空间的话 这里也只需要进行交换,所以为O(1).