1.插入排序—直接插入排序
include <stdio.h>
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
return;
}
void sort_insert(int n, int seq[])
{
if (n < 2)
return;
int i, k;
for (k = 1; k < n; ++ k)
{
for (i = k; i > 0; -- i)
{
if (seq[i] >= seq[i - 1])
break;
else
swap(&seq[i], &seq[i - 1]);
}
}
return;
}
void print(int n, int seq[])
{
for (int i = 0; i < n; ++ i)
{
printf("%d ", seq[i]);
}
printf("\n");
}
int main()
{
int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
print(10, seq);
sort_insert(10, seq);
print(10, seq);
return 0;
}
2.插入排序—希尔排序
#include <stdio.h>
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
return;
}
void sort_shell(int n, int seq[])
{
if (n < 2)
return;
int i, j, k;
k = n / 2;
while (k > 0)
{
for (j = k; j < n; j += k)
{
for (i = j; i >= k; i -= k)
{
if (seq[i] >= seq[i - k])
break;
else
swap(&seq[i], &seq[i - k]);
}
}
k /= 2;
}
return;
}
void print(int n, int seq[])
{
for (int i = 0; i < n; ++ i)
{
printf("%d ", seq[i]);
}
printf("\n");
}
int main()
{
int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
print(10, seq);
sort_shell(10, seq);
print(10, seq);
return 0;
}
3.选择排序—简单选择排序
include <stdio.h>
void sort_select(int n, int seq[])
{
if (n < 2)
return;
int i, j, k, tmp;
for (i = 0; i < n; ++ i)
{
tmp = seq[i];
k = i;
for (j = i; j < n; ++ j)
{
if (tmp > seq[j])
{
tmp = seq[j];
k = j;
}
}
if (k != i)
{
seq[k] = seq[i];
seq[i] = tmp;
}
}
return;
}
void print(int n, int seq[])
{
for (int i = 0; i < n; ++ i)
{
printf("%d ", seq[i]);
}
printf("\n");
}
int main()
{
int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
print(10, seq);
sort_select(10, seq);
print(10, seq);
return 0;
}
4.选择排序—堆排序
#include <stdio.h>
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
return;
}
void heap_adjust(int k, int n, int seq[])
{
int i, child;
for (i = k; 2 * i + 1 < n; i = child)
{
child = 2 * i + 1;
if (child + 1 < n && seq[child] < seq[child + 1])
++ child;
if (seq[i] < seq[child])
swap(&seq[i], &seq[child]);
}
return;
}
void sort_heap(int n, int seq[])
{
if (n < 2)
return;
int i;
for (i = n / 2 - 1; i >= 0; -- i)
{
heap_adjust(i, n, seq);
}
for (i = n - 1; i > 0; -- i)
{
swap(&seq[0], &seq[i]);
heap_adjust(0, i, seq);
}
return;
}
void print(int n, int seq[])
{
for (int i = 0; i < n; ++ i)
{
printf("%d ", seq[i]);
}
printf("\n");
}
int main()
{
int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
print(10, seq);
sort_heap(10, seq);
print(10, seq);
return 0;
}
5.交换排序—冒泡排序
#include <stdio.h>
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
return;
}
void sort_bubble(int n, int seq[])
{
if (n < 2)
return;
int i, j, flag;
for (i = n - 1; i > 0; -- i)
{
flag = 0;
for (j = 0; j < i; ++ j)
{
if (seq[j] > seq[j + 1])
{
flag = 1;
swap(&seq[j], &seq[j + 1]);
}
}
if (!flag)
break;
}
return;
}
void print(int n, int seq[])
{
for (int i = 0; i < n; ++ i)
{
printf("%d ", seq[i]);
}
printf("\n");
}
int main()
{
int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
print(10, seq);
sort_bubble(10, seq);
print(10, seq);
return 0;
}
6.交换排序—快速排序
#include <stdio.h>
void sort_quick(int start, int end, int seq[])
{
if (end - start < 1)
return;
int i, j, tmp;
tmp = seq[start];
i = start;
j = end;
while (i < j)
{
while (i < j && seq[j] >= tmp)
-- j;
seq[i] = seq[j];
while (i < j && seq[i] <= tmp)
++ i;
seq[j] = seq[i];
}
seq[i] = tmp;
sort_quick(start, i - 1, seq);
sort_quick(i + 1, end, seq);
return;
}
void print(int n, int seq[])
{
for (int i = 0; i < n; ++ i)
{
printf("%d ", seq[i]);
}
printf("\n");
}
int main()
{
int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
print(10, seq);
sort_quick(0, 9, seq);
print(10, seq);
return 0;
}
7.归并排序
#include <stdio.h>
void sort_merge(int start, int end, int seq[], int tmp[])
{
if (end - start < 1)
return;
int i, j, k, mid;
mid = (start + end) / 2;
sort_merge(start, mid, seq, tmp);
sort_merge(mid + 1, end, seq, tmp);
i = start;
j = mid + 1;
k = start;
while (i <= mid && j <= end)
{
if (seq[i] > seq[j])
tmp[k ++] = seq[j ++];
else
tmp[k ++] = seq[i ++];
}
while (i <= mid)
tmp[k ++] = seq[i ++];
while (j <= end)
tmp[k ++] = seq[j ++];
for (i = start; i <= end; ++ i)
seq[i] = tmp[i];
return;
}
void print(int n, int seq[])
{
for (int i = 0; i < n; ++ i)
{
printf("%d ", seq[i]);
}
printf("\n");
}
int main()
{
int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
int tmp[10];
print(10, seq);
sort_merge(0, 9, seq, tmp);
print(10, seq);
return 0;
}
8.基数排序
#include <stdio.h>
int tmp[10][11];
int getkey(int num, int index)
{
int i, temp = 1;
for (i = 1; i < index; ++ i)
temp *= 10;
return (num / temp) % 10;
}
void sort_radix(int ckey, int nkey, int n, int seq[])
{
if (n < 2)
return;
int i, j, k, l, key;
for (i = ckey; i < nkey; ++ i)
{
for (j = 0; j < 10; ++ j)
tmp[j][0] = 0;
for (j = 0; j < n; ++ j)
{
key = getkey(seq[j], i);
k = tmp[key][0];
tmp[key][k + 1] = seq[j];
++ tmp[key][0];
}
for (j = 0, l = 0; j < 10; ++ j)
for (k = 0; k < tmp[j][0]; ++ k)
{
seq[l ++] = tmp[j][k + 1];
}
}
return;
}
void print(int n, int seq[])
{
for (int i = 0; i < n; ++ i)
{
printf("%d ", seq[i]);
}
printf("\n");
}
int main()
{
int seq[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
print(10, seq);
sort_radix(1, 3, 10, seq);
print(10, seq);
return 0;
}