二分插入排序
#include <stdio.h>
void mySwap(int *a , int i , int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void mySort(int *a , int len)
{
int i ;
for(i = 1 ; i < len ; i++)
{
int left = 0;
int right = i-1;
int get = a[i];
while(left <= right)
{
int mid = (left + right)/2;
if(a[mid] > get)
right = mid - 1;
else
left = mid + 1;
}
//移位
int j;
for(j = i-1 ; j >= left ; j--)
{
a[j+1] = a[j];
}
a[left] = get;
}
}
void myPrint(int *a , int len)
{
int i;
for(i = 0 ; i < len ; i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
int main()
{
int a[] = {8, 7, 9, 6, 3, 4, 5, 2, 1, 0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a , len);
myPrint(a , len);
return 0;
}
希尔排序
#include <stdio.h>
void mySwap(int *a , int i , int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void mySort(int *a , int len)
{
int gap = 1;
while(gap < len)
{
gap = gap * 3 + 1;
}
while (gap > 0)
{
int i ;
for(i = gap ; i < len ; i++)
{
int get = a[i];
int j = i-gap;
while(j >= 0 && a[j] > get)
{
a[j+gap] = a[j];
j -= gap;
}
a[j+gap] = get;
}
gap = gap/3;
}
}
void myPrint(int *a , int len)
{
int i;
for(i = 0 ; i < len ; i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
int main()
{
int a[] = {8, 7, 9, 6, 3, 4, 5, 2, 1, 0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a , len);
myPrint(a , len);
return 0;
}