#include <cstdio>
#include <cstdlib>
#include <cmath>
void swap(int *a, int *b);
void quick_sort(int array[], int low, int heigh);
int partion(int array[], int low, int heigh);
void init_heap(int array[], int id, int len);
void heap_sort(int array[], int len);
void insert_sort(int array[], int len, int delta); //delta:增量
void shell_sort(int array[], int len);
int main()
{
int array[] = {5, 9, 1, 4, 8, 6, 2, 3, 7, 0, 13, 17, 12, 15, 14, 16, 11, 10};
//调用快速排序
//quick_sort(array, 0, 17);
//调用堆排序
//heap_sort(array, 18);
//调用直接插入排序
//insert_sort(array, 18, 1);
//调用希尔排序
shell_sort(array, 18);
for (int i = 0; i < 18; i++)
printf("%d\n", array[i]);
system("pause");
return 0;
}
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
/***********************************************************************/
//FUNCTION:
void quick_sort(int array[], int low, int heigh)
{
if (low < heigh)
{
int loc = partion(array, low, heigh);
quick_sort(array, low, loc-1);
quick_sort(array, loc+1, heigh);
}
}
int partion(int array[], int low, int heigh)
{
int p = low, q = heigh;
int key = array[low];
while (p < q)
{
while (array[q]>=key && p<q)
q--;
swap(&array[p], &array[q]);
while (array[p]<=key && p<q)
p++;
swap(&array[p], &array[q]);
}
return p;
}
/***********************************************************************/
//FUNCTION:当前结点id,根结点id从0开始编号
void init_heap(int array[], int id, int len)
{
if (id > len/2-1) //是否存在孩子结点
return;
int lchildID = 2*id+1;
int maxValueID = lchildID; //保存数值最大的那个结点ID
if (lchildID+1 < len && array[lchildID] < array[lchildID+1]) //若存在孩子结点,且右结点值大于左结点值
maxValueID = lchildID+1;
if (array[id] < array[maxValueID])
{
swap(&array[id], &array[maxValueID]);
init_heap(array, maxValueID, len);
}
}
void heap_sort(int array[], int len)
{
for (int i = len/2-1; i >= 0; i--)
init_heap(array, i, len);
for (int j = len-1; j > 0; j--)
{
swap(&array[0], &array[j]);
init_heap(array, 0, j);
}
}
/***********************************************************************/
//FUNCTION:
void insert_sort(int array[], int len, int delta)
{
for (int i = 1; i < len; i += delta)
{
int key = array[i];
int j;
for (j = i-delta; j >= 0; j -= delta)
{
if (key < array[j])
{
array[j+delta] = array[j];
array[j] = key;
}
else
break;
}
}
}
void shell_sort(int array[], int len)
{
int delta_len = (int)(logf(len)/logf(2));
int *delta = (int *)malloc(sizeof(int)*delta_len); //增量数组
int tLen = len;
for (int i = 0; i < delta_len; i++)
{
delta[i] = tLen/2;
tLen /= 2;
}
for (int i = 0; i < delta_len; i++) //执行希尔排序
insert_sort(array, len, delta[i]);
free(delta);
delta = NULL;
}