- 快速排序
- 直接插入排序
- 希尔排序
- 简单选择排序
- 堆排序
- 冒泡排序
- 归并排序
- 基数排序
1快速排序
#include <stdio.h>
void QuickSort(int *a, int start, int end)
{
int x = start;
int y = end;
int base = a[x];
if (x >= y)
{
return;
}
while (x < y)
{
while (a[y] > base && x < y)
{
y--;
}
if (x < y)
{
a[x++] = a[y];
}
while (a[x] < base && x < y)
{
x++;
}
if (x < y)
{
a[y--] = a[x];
}
}
a[x] = base;
QuickSort(a, start, x - 1);
QuickSort(a, x + 1, end);
}
int main()
{
int i;
int array[100000] = {0};
srand(time(NULL));
for (i = 0; i < 100000; i++)
{
array[i] = rand() % 1000 + 1;
}
QuickSort(array, 0, sizeof(array) / sizeof(array[0]) - 1);
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
2直接插入排序
#include <stdio.h>
void InsertSort(int *a, int length)
{
int i, j, tmp;
for (i = 1; i < length; i++)
{
tmp = a[i];
for (j = i - 1; j >= 0; j--)
{
if (tmp < a[j])
{
a[j + 1] = a[j];
}
else
{
break;
}
}
a[j + 1] = tmp;
}
}
int main()
{
int i;
int array[10000] = {0};
srand(time(NULL));
for (i = 0; i < 10000; i++)
{
array[i] = rand() % 1000 + 1;
}
InsertSort(array, sizeof(array) / sizeof(array[0]));
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
3希尔排序
#include <stdio.h>
void InsertSort(int *a, int length)
{
int i, j, tmp, h;
for (h = length / 2; h > 0; h /= 2)
{
for (i = h; i < length; i++)
{
tmp = a[i];
for (j = i - h; j >= 0; j = j - h)
{
if (tmp < a[j])
{
a[j + h] = a[j];
}
else
{
break;
}
}
a[j + h] = tmp;
}
}
}
int main()
{
int i;
int array[10000] = {0};
srand(time(NULL));
for (i = 0; i < 10000; i++)
{
array[i] = rand() % 1000 + 1;
}
InsertSort(array, sizeof(array) / sizeof(array[0]));
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
4简单排序
#include <stdio.h>
void SelectSort(int *a, int length)
{
int i, j, min, index;
for (i = 0; i < length - 1; i++)
{
min = a[i];
index = i;
for (j = i + 1; j <= length - 1; j++)
{
if (a[j] < min)
{
min = a[j];
index = j;
}
}
if (index != i)
{
a[i] = a[i] + a[index];
a[index] = a[i] - a[index];
a[i] = a[i] - a[index];
}
}
}
int main()
{
int i;
int array[10000] = {0};
srand(time(NULL));
for (i = 0; i < 10000; i++)
{
array[i] = rand() % 1000 + 1;
}
SelectSort(array, sizeof(array) / sizeof(array[0]));
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
5堆排序
#include <stdio.h>
void AdjustMaxHeap(int *a, int root, int last)
{
int i, child;
int tmp = a[root];
for (; 2 * root + 1 <= last; root = child)
{
child = 2 * root + 1;
if (child + 1 <= last && a[child] < a[child + 1])
{
child++;
}
if (a[child] > a[root])
{
a[root] = a[child];
a[child] = tmp;
}
else
{
break;
}
}
}
void swap(int *x, int *y)
{
int t = *x;
*x = *y;
*y = t;
}
void HeapSort(int *a, int length)
{
int i;
for (i = length / 2 - 1; i >= 0; i--)
{
AdjustMaxHeap(a, i, length - 1);
}
for (i = length - 1; i > 0; i--)
{
swap(&a[0], &a[i]);
AdjustMaxHeap(a, 0, i - 1);
}
}
int main()
{
int i;
int array[100000] = {0};
srand(time(NULL));
for (i = 0; i < 100000; i++)
{
array[i] = rand() % 1000 + 1;
}
HeapSort(array, sizeof(array) / sizeof(array[0]));
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
6冒泡排序
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void get_array(int a[], int length)
{
int i;
srand(time(NULL));
for(i = 0; i < length; i++)
{
a[i] = rand() % 1000;
}
}
void sort(int a[], int length)
{
int i, j;
for(i = 0; i < length - 1; i++)
{
for (j = 0; j < length - i - 1; j++)
{
if (a[j] > a[j + 1])
{
#if 0
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
#endif
a[j] = a[j] + a[j + 1];
a[j + 1] = a[j] - a[j + 1];
a[j] = a[j] - a[j + 1];
}
}
}
}
void print_array(int a[], int length)
{
int i;
for (i = 0; i < length; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
int main()
{
int i, j, a[100000] = {0};
get_array(a, sizeof(a) / sizeof(a[0]));
sort(a, sizeof(a) / sizeof(a[0]));
print_array(a, sizeof(a) / sizeof(a[0]));
return 0;
}
7归并排序
#include <stdio.h>
#include <stdlib.h>
void Merge(int *a, int start, int mid, int end)
{
int LeftLen = mid - start + 1;
int RightLen = end - mid;
int *L = (int *)malloc(sizeof(int) * LeftLen);
int *R = (int *)malloc(sizeof(int) * RightLen);
int i, k, j;
for (i = 0, k = start; i < LeftLen; i++, k++)
{
L[i] = a[k];
}
for (j = 0; j < RightLen; j++, k++)
{
R[j] = a[k];
}
for (i = 0, j = 0, k = start; i < LeftLen && j < RightLen; k++)
{
if (L[i] < R[j])
{
a[k] = L[i++];
}
else
{
a[k] = R[j++];
}
}
if (j < RightLen)
{
for (; j < RightLen; j++, k++)
{
a[k] = R[j];
}
}
if (i < LeftLen)
{
for (; i < LeftLen; i++, k++)
{
a[k] = L[i];
}
}
}
void MergeSort(int *a, int start, int end)
{
if (start >= end)
{
return;
}
int mid = (start + end) / 2;
MergeSort(a, start, mid);
MergeSort(a, mid + 1, end);
Merge(a, start, mid, end);
}
int main()
{
int i;
int array[10000] = {0};
srand(time(NULL));
for (i = 0; i < 10000; i++)
{
array[i] = rand() % 1000 + 1;
}
MergeSort(array, 0, sizeof(array) / sizeof(array[0]) - 1);
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
8基数排序
#include <stdio.h>
#include <stdlib.h>
void RadixSort(int *a, int length)
{
int max = a[0], i, radix = 1;
for (i = 1; i < length; i++)
{
if (a[i] > max)
{
max = a[i];
}
}
int *t = (int *)malloc(sizeof(int) * length);
while (max / radix != 0)
{
int bucket[10] = {0};
for (i = 0; i < length; i++)
{
bucket[a[i] / radix % 10]++;
}
for (i = 1; i <= 9; i++)
{
bucket[i] = bucket[i] + bucket[i - 1];
}
for (i = length - 1; i >= 0; i--)
{
t[bucket[a[i] / radix % 10] - 1] = a[i];
bucket[a[i] / radix % 10]--;
}
for (i = 0; i < length; i++)
{
a[i] = t[i];
}
radix = radix * 10;
}
free(t);
}
int main()
{
int i;
int array[10000] = {0};
srand(time(NULL));
for (i = 0; i < 10000; i++)
{
array[i] = rand() % 1000 + 1;
}
RadixSort(array, sizeof(array) / sizeof(array[0]));
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}