以下是小白我翻看了n条大佬写的帖子,与《大话数据结构》这本书上的一些排序讲解,在几个与月同在的夜晚,滴干了眼药水(蛤蛤狗头警告)在本人的思路上肝出来的排序代码集,经测试无误才水帖上来(bug:你尽管运行 我负责打脸)有错误欢迎指出哦。
代码如下
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100 //数组的大小,可自行设置
/*---输出与置换操作---*/
void print(int* a);
void swap(int *a,int i, int j);
/*-----------排序方法----------*/
void sort1(int* a);//优化版冒泡排序
void sort2(int* a);//选择法排序
void sort3(int* a);//简单插入排序
void sort4(int* a);//折半插入排序
void sort5(int* a);//希尔排序
//堆排序
void sort6(int* a);
void sort6_siftdown(int *a,int i, int j);
//归并排序
void sort7(int* a);
void sort7_MSort(int* a, int frist, int last, int* temp);
void sort7_Merge(int* a, int frist, int mid, int last, int* temp);
//快速排序
void sort8(int* a);
void sort8_quick(int* a, int left, int right);
void sort9(int* a);//计数排序
void sort10(int* a);//基数排序
/*-----------------------------*/
/*---------测试数据------------*/
int* arry()
{
int *a=(int *)malloc(sizeof(int)*MAX);
for (int i = 0; i < MAX; i++) a[i]= rand();
return a;
}
/*-----------------------------*/
输出与置换操作
void print(int* a)
{
int i;
for (i = 0; i < MAX; i++)
printf("%d ", a[i]);
printf("\n");
}
void swap(int *a,int i, int j)
{
int t;
t = a[i]; a[i] = a[j]; a[j] = t;
}
优化版冒泡排序
void sort1(int* a)
{
int i, j;
for (i = 1; i < MAX; i++)
{
int flag = 1;
for (j = 0; j < MAX - i; j++)
{
if (a[j] > a[j + 1]) { flag = 0; swap(a,j, j + 1); }
}
if (flag) break;
}
}
选择法排序
void sort2(int* a)
{
int i, j, max;
for (i = 0; i < MAX; i++)
{
max = 0;
for (j = 0; j < MAX - i; j++)
{
if (a[j] > a[max]) max = j;
}
swap(a,j - 1, max);
}
}
简单插入排序
void sort3(int* a)
{
int i, j, temp;
for (i = 0; i < MAX - 1; i++)
{
if (a[i + 1] < a[i])
{
temp = a[i + 1];
for (j = i; j >= 0; j--)
{
if (temp > a[j]) break;
a[j + 1] = a[j];
}
a[j + 1] = temp;
}
}
}
折半插入排序
void sort4(int* a)
{
int i, t, left, right, middle, temp;
for (i = 0; i < MAX - 1; i++)
{
if (a[i + 1] < a[i])
{
temp = a[i + 1];
left = 0; right = i;
while (left <= right)
{
middle = (left + right) / 2;
if (temp > a[middle]) left = middle + 1;
else right = middle - 1;
}
if (a[middle] < temp) middle++;
for (t = i; t >= middle; t--) a[t + 1] = a[t];
a[middle] = temp;
}
}
}
希尔排序
void sort5(int* a)
{
int increment = MAX, i, j, t, temp;
do
{
increment = increment / 3 + 1;
for (i = 0; i + increment < MAX; i += increment)
{
if (a[i + increment] < a[i])
{
temp = a[i + increment];
for (j = i; j >= 0; j -= increment)
{
if (temp > a[j]) break;
a[j + increment] = a[j];
}
a[j + increment] = temp;
}
}
} while (increment > 1);
}
堆排序
void sort6(int* a)
{
int i, j = MAX, t;
for (i = j / 2 - 1; i >= 0; i--) sort6_siftdown(a,i, j);
for (t = 0; t < MAX; t++)
{
swap(a,--j, 0);
sort6_siftdown(a,0, j);
}
}
void sort6_siftdown(int *a,int i, int j)
{
int t, max;
while (i * 2 + 1 < j)
{
max = i;
if (a[i * 2 + 1] > a[i]) max = i * 2 + 1;
if (i * 2 + 2 < j && a[i * 2 + 2] > a[max]) max = i * 2 + 2;
if (max != i) { swap(a,i, max); i = max; }
else break;
}
}
归并排序
void sort7(int* a)
{
int* temp = (int*)malloc(sizeof(int) * MAX);
sort7_MSort(a, 0, MAX - 1, temp);
}
void sort7_MSort(int* a, int frist, int last, int* temp)
{
if (frist < last)
{
int mid = (frist + last) / 2;
sort7_MSort(a, frist, mid, temp);
sort7_MSort(a, mid + 1, last, temp);
sort7_Merge(a, frist, mid, last, temp);
}
}
void sort7_Merge(int* a, int frist, int mid, int last, int* temp)
{
int i = frist, j = mid + 1, k = 0, t;
while (i <= mid && j <= last)
{
if (a[i] < a[j]) temp[k++] = a[i++];
else temp[k++] = a[j++];
}
while(i <= mid) temp[k++] = a[i++];
while (j <= last) temp[k++] = a[j++];
for (t = 0; t < k; t++) a[t + frist] = temp[t];
}
快速排序
void sort8(int* a)
{
sort8_quick(a, 0, MAX - 1);
}
void sort8_quick(int* a, int left, int right)
{
if (left >= right) return;
int temp = a[left], i = left, j = right;
while (i != j)
{
while (a[j] >= temp && j > i) j--;
while (a[i] <= temp && j > i) i++;
if (j > i) swap(a,i, j);
}
swap(a,i, left);
sort8_quick(a, left, i - 1); sort8_quick(a, i + 1, right);
}
计数排序
void sort9(int* a)
{
int min = a[0], max = a[0], i;
int* new_a = (int*)malloc(MAX * sizeof(int));
for (i = 1; i < MAX; i++)
{
if (a[i] > max) max = a[i];
if(a[i]<min) min = a[i];
}
int* book = (int*)malloc((max - min + 1) * sizeof(int));
for (i = 0; i < max - min + 1; i++) book[i] = 0;
for (i = 0; i < MAX; i++) book[a[i] - min]+=1;
for (i = 1; i < max - min + 1; i++) book[i] += book[i - 1];
for (i = 0; i < MAX; i++)
{
new_a[book[a[i] - min] - 1] = a[i]; book[a[i]-min]--;
}
for (i = 0; i < MAX; i++) a[i] = new_a[i];
}
基数排序 (不适用于负数情况)
void sort10(int* a)
{
int book[10][MAX+1], flag = 1, i, j = 1, t, k, temp;
for (i = 0; i < 10; i++) book[i][MAX] = 0;
while (flag)
{
flag = 0;
for (i = 0; i < MAX; i++)
{
if (a[i] / j % 10 != 0) flag = 1;
temp = a[i] / j % 10;
book[temp][book[temp][MAX]] = a[i];
book[temp][MAX]++;
}
j *= 10;
for (i = 0, k = 0; i < 10; i++)
{
for (t = 0; t < book[i][MAX]; t++) { a[k++] = book[i][t]; }
book[i][MAX] = 0;
}
}
}
END