头文件
#include"stdio.h"
void InsertSort(int* array, int size);
void InsertSort_OP(int* array, int size);
void ShellSort(int* array, int size);
void QuickSort(int* array, int left, int right);
void QuickSortNor(int* array, int size);
void SelectSort(int* array, int size);
void SelectSort_OP(int* array, int size);
void HeapAdjust(int* array, int size, int parent);
void HeapSort(int* array, int size);
void BubbleSort(int* array, int size);
int Quicksort(int *array,int left,int right);
int GetMidDataIndex(int* array, int left, int right);
int partion1(int* array, int left, int right);
int partion2(int* array, int left, int right);
int partion3(int* array, int left, int right);
void MergeData(int* array, int left, int mid, int right, int* temp);
void MergeSrot(int* array, int size);
void MergeSortNor(int* array, int size);
void CountSort(int* array, int size,int *c,int *output,int k);
void RadixSortLSD(int* array, int size);
/ 桶排序
void bucketsort(int *array, int size);
函数实现
void InsertSort(int *array, int size)
{
for (int i = 1; i < size; i++)
{
int end = i - 1;
int key = array[i];
while (array[end] >key&&end>0)
{
array[end+1]=array[end];
end--;
}
array[end+1] = key;
}
return array;
}
void InsertSort_OP(int* array, int size)
{
for (int i = 1; i < size; i++)
{
int end = i - 1;
int key = array[i];
int left = 0;
int right = end;
while (left <= right)
{
int mid = (left + right) >> 1;
if (key < array[mid])
{
right = mid + 1;
}
else
left = mid + 1;
}
array[left] = key;
}
}
void ShellSort(int* array, int size)
{
int gap=1;
while (gap < size / 3)
{
gap = gap * 3 + 1;
}
while (gap)
{
for (int i = 0; i < size; i += gap)
{
int end = i - gap;
int key = array[i];
while (array[end] < array[i] && end >= 0)
{
array[end + gap] = array[end];
end -= gap;
}
array[end + gap] = key;
}
gap--;
}
}
void SelectSort(int* array, int size)
{
int maxpos = 0;
for (int i = 0; i < size - 1; i++)
{
for (int j = i+1; j < size - i; j++)
{
if (array[j]>array[maxpos])
{
maxpos = j;
}
}
Swap(&array[maxpos], &array[size - i]);
}
}
void SelectSort(int* array, int size)
{
int minpos= 0;
for (int i = 0; i < size; i++)
{
for (int j = i+1; j < size - i; j++)
{
if (array[j]>array[minpos])
{
minpos = j;
}
}
Swap(&array[minpos], &array[i]);
}
}
void SelectSort_OP(int* array, int size)
{
int maxpos = size-1;
int minpos = 0;
for (int i = 0; i < size - 1; i++)
{
for (int j = i+1; j < size - i; j++)
{
if (array[j]>array[maxpos])
{
maxpos = j;
}
if (array[j] < array[minpos])
{
minpos = j;
}
if (minpos != 0)
Swap(&array[minpos], &array[i]);
if (i = maxpos)
maxpos = minpos;
if (maxpos != size - 1)
Swap(&array[maxpos], &array[size - 1]);
}
}
}
void HeapSort(int* array, int size)
{
int end = size - 1;
int root = (end - 1) / 2;
for (; root >= 0; root--)
{
HeapAdjust(array, size, root);
}
while (end > 1)
{
Swap(&array[0], &array[size - 1]);
--end;
HeapAdjust(array, end, 0);
}
}
void HeapAdjust(int* array,int size,int parent)
{
int child = 2 * parent + 1;
while (child<size)
{
if (array[child]<array[child + 1] && child<size)
{
child = child + 1;
}
if (array[child] >array[parent])
{
Swap(&array[parent], &array[child]);
parent = child;
child = parent * 2 + 1;
}
}
}
void BubbleSort(int* array, int size)
{
for (int i = 0; i < size - 1; i++)
{
for (int j = 0;j< size - 1 - i; j++)
{
if (array[j-1] >array[j ])
{
Swap(&array[j], &array[j +1]);
}
}
}
}
void Swap(int *left, int *right)
{
int tmp = *left;
*left = *right;
*right = tmp;
}
int Quicksort(int *array, int left, int right)
{
int div;
int key;
if (left < right)
{
div = partion(left, right, array,key);
}
Quicksort(array, left, div);
Quicksort(array, div, right);
}
int partion(int left, int right, int *array)
{
int key = array[right-1];
int begin = left;
int end = right - 1;
while (begin < end)
{
while (array[begin] <= key)
{
begin++;
}
while (array[end] >= key)
{
end--;
}
Swap(&array[begin], &array[end]);
}
Swap(&array[begin], &array[right - 1]);
return begin;
}
int partion2(int* array, int left, int right)
{
int begin = left;
int end = right;
int key = 5;
while (begin < end)
{
while (array[begin] < key)
{
begin++;
}
array[end] = array[begin];
while (array[end] >= key)
{
end--;
}
array[begin] = array[end];
}
array[begin] = key;
return begin;
}
int partion3(int* array, int left, int right)
{
int pcur = left;
int prev = left - 1;
int key = 5;
while (pcur > prev)
{
while (array[pcur] < key)
{
Swap(&array[pcur], &array[prev]);
}
pcur++;
}
return prev;
}
void MergeData(int* array, int left, int mid, int right, int* temp)
{
int begin1 = left;
int end1 = mid;
int begin2 = mid + 1;
int end2 = right;
int index = 0;
while (begin1 < end1&&begin2 < end2)
{
if (array[begin1] <= array[begin2])
{
temp[index++] = array[begin1++];
}
else
{
temp[index++] = array[begin2++];
}
}
while (begin1 < end1)
{
temp[index++] = array[begin1];
}
while (begin2 < end2)
{
temp[index++] = array[begin2];
}
}
void MergeSrot(int* array,int left,int right)
{
int *temp = (int*)malloc(sizeof(array[0])*(right - left));
if (left < right)
{
int mid = left + (right - left) >> 1;
MergeSrot(array, left, mid);
MergeSrot(array, mid + 1, right);
MergeData(array, left, mid, right, temp);
memcpy(array + left, temp + left, sizeof(array[0])*(right - left));
}
}
void CountSort(int* array, int size, int *c, int *output, int k)
{
int i;
int j;
for (i = 0; i < size; i++)
{
c[array[i]]++;
}
for (i = 1; i <= k; i++)
{
c[i] = c[i] + c[i - 1];
}
for (i = k; i >= 0; i--)
{
for (j =c[i]-c[i-1]; j > 0; j--)
{
output[c[i] - 1] = i;
c[i] = c[i] - 1;
}
}
return 1;
}
void RadixSortLSD(int* array, int size)
{
int max = 0;
int dig = 1;
for (int i = 0; i < size; i++)
{
if (array[i]>max)
{
max = array[i];
}
}
while (max > 10)
{
dig++;
max = max / 10;
}
int *temp = (int*)malloc(sizeof(array[0])*size);
int mod = 10;
int count[] = { 0 };
for (int i = 0; i < max; i++)
{
for (int j = 0; j < size; j++)
{
int k = (array[j] % mod) / dig;
count[k]++;
}
for (int j= 0; j < size; j+=count[)
{
temp[j] = array[j]
}
}
}
void bucketsort(int *array, int size)
{
int max = 0;
int dig = 1;
for (int i = 0; i < size; i++)
{
if (array[i]>max)
{
max = array[i];
}
}
while (max > 10)
{
dig++;
max = max / 10;
}
while (dig)
{
int count[10] = { 0 };
for (int i = 0; i < size; i++)
{
count[array[i] / dig % 10]++;
}
int addr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
addr[i] = count[i - 1] + addr[i - 1];
}
int *bucket = (int*)malloc(sizeof(int)*size);
for (int i = 0; i < size; i++)
{
bucket[addr[array[i] / dig % 10]++] = array[i];
}
dig--;
memcpy(array, bucket, sizeof(int)*size);
free(bucket);
}
}