直接插入排序与折半插入排序:
#include <iostream>
using namespace std;
//直接插入排序
void InsertSort(int *arr,int size)
{
int j;
if(!arr)
return ;
for (int i=1;i<size;i++)
{
int tmp = arr[i];
for (j = i-1; j>=0 && tmp < arr[j];j--)
{
arr[j+1] = arr[j];
}
arr[j+1] =tmp ;
}
}
/// 二分插入排序
void BInsertSort (int * arr,int size)
{
if(!arr)
return ;
for (int i =1 ;i<size ;i++)
{
int tmp = arr[i];
//二分查找来确定欲插入元素的应在位置
int low =0,high = i-1 ,mid ;
while (low<= high)
{
mid= (low+high)/2;
if(arr[i]<arr[mid])
high = mid-1;
else
low = mid +1 ;
}
for (int j =i-1 ;j>=low;j--)
{
arr[j+1]= arr[j];
}
arr[low]= tmp ;
}
}
void output(int *a, int len)
{
for(int i = 0; i < len; ++i)
{
cout << a[i] << " ";
}
cout << endl;
}
int main()
{
int a[] = {6, 9, 1, 3, 6, 8, 9, 4};
int len = sizeof(a) / sizeof(int);
output(a, len);
InsertSort(a,len);
output(a, len);
BInsertSort(a,len);
output(a, len);
}
希尔排序:
#include <iostream>
#include <stdlib.h>
using namespace std;
void ShellInsert(int *arr ,int size ,int delta)
{
int j;
for (int i = delta;i<size;i++)
{
int tmp = arr[i];
for (j = i-delta; j>=0 && tmp < arr[j];j-=delta)
{
arr[j+delta] = arr[j];
}
arr[j+delta] = tmp ;
}
}
void ShellSort(int * arr,const int size)
{
if(!arr)
return ;
int increment = size ;
do {
increment = increment/3 +1;
ShellInsert(arr,size,increment);
} while(increment>1);
}
void output(int *a, int len)
{
for(int i = 0; i < len; ++i)
{
cout << a[i] << " ";
}
cout << endl;
}
int main()
{
int a[] = {6, 9, 1, 3, 6, 8, 9, 4};
int len = sizeof(a) / sizeof(int);
output(a, len);
ShellSort(a,len);
output(a, len);
}