概要
- 冒泡排序
- 插入排序
- 简单选择排序
- 快速排序
- 希尔排序
- 归并排序
- 堆排序
- 基数排序
冒泡排序
#include<stdio.h>
void BubbleSort(int a[],int size){
for (int i = 0;i < size - 1;++i) { //共size - 1趟
int flag = 0;
for (int j = 0;j < size - i - 1;++j) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = 1;
}
}
if (!flag) break;
}
printf("冒泡排序:");
for (int i = 0;i < size;++i) {
printf("%3d ", a[i]);
}
printf("\n");
}
int main() {
int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
printf("原始序列:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
printf("\n");
BubbleSort(a, 10);
printf("\n");
return 0;
}
插入排序
#include<stdio.h>
void InsertSort(int a[], int size) {
int i, j;
for (i = 1;i < size;++i) { //从1开始插入
if (a[i] < a[i - 1]) {
int t = a[i];
for (j = i - 1;t < a[j];--j) { //找到有序部分插入位置,往后调整
a[j + 1] = a[j];
}
a[j + 1] = t;
}
}
printf("插入排序:");
for (int i = 0;i < size;++i) {
printf("%3d ", a[i]);
}
printf("\n");
}
int main() {
int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
printf("原始序列:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
printf("\n");
InsertSort(a, 10);
return 0;
}
简单选择排序
#include<stdio.h>
void SelectSort(int a[], int size) {
for (int i = 0;i < size;++i) {
for (int j = i + 1;j < size;++j) {
if (a[i] > a[j]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
printf("选择排序:");
for (int i = 0;i < size;++i) {
printf("%3d ", a[i]);
}
printf("\n");
}
int main() {
int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
printf("原始序列:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
printf("\n");
SelectSort(a, 10);
return 0;
}
快速排序
#include<stdio.h>
int Partition(int a[], int low, int high) {
int pivot = a[low];
while (low < high) {
while (low < high&&pivot <= a[high]) --high;
a[low] = a[high];
while (low < high&&pivot >= a[low])++low;
a[high] = a[low];
}
a[low] = pivot;
return low;
}
void QuickSort(int a[], int low, int high) {
if (low < high) {
int pivotopos = Partition(a, low, high);
QuickSort(a, low, pivotopos - 1);
QuickSort(a, pivotopos + 1, high);
}
}
int main() {
int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
printf("原始序列:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
printf("\n");
QuickSort(a, 0, 9);
printf("快速排序:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
printf("\n");
return 0;
}
希尔排序
#include<stdio.h>
void ShellSort(int a[], int size) {
int increment = size; //增量
while (increment > 1) {
increment = increment / 3 + 1;
int i, j;
for (i = increment;i < size;++i) {
if (a[i] < a[i - increment]) {
int t = a[i];
for (j = i - increment;t < a[j] && j >= 0;j -= increment) {
a[j + increment] = a[j];
}
a[j + increment] = t;
}
}
}
printf("希尔排序:");
for (int i = 0;i < size;++i) {
printf("%3d ", a[i]);
}
}
int main() {
int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
printf("原始排序:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
printf("\n");
ShellSort(a, 10);
return 0;
}
归并排序
#include<stdio.h>
#define n 10
void Merge(int a[], int low, int mid, int high) {
int *b = (int *)malloc(n * sizeof(int)); //辅助数组
//先复制到辅助数组
int k, i, j;
for (k = low;k <= high;++k) {
b[k] = a[k];
}
for (i = low, j = mid + 1, k = i;i <= mid && j <= high;++k) {
if (b[i] <= b[j]) a[k] = b[i++];
else a[k] = b[j++];
}
while (i <= mid) a[k++] = b[i++];
while (j <= high) a[k++] = b[j++];
}
void MergeSort(int a[], int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
MergeSort(a, low, mid);
MergeSort(a, mid + 1, high);
Merge(a, low, mid, high);
}
}
int main() {
int a[n] = { 1,9,3,-1,8,-6,4,5,2,-10 };
printf("原始序列:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
printf("\n");
MergeSort(a, 0, n-1);
printf("归并排序:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
return 0;
}
堆排序
#include<stdio.h>
void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void heapify(int tree[], int n, int i) {
if (i >= n) return; //递归出口
int c1 = 2 * i + 1;
int c2 = 2 * i + 2;
int max = i;
if (c1 < n && tree[c1] > tree[max]) { //找出父节点和子女结点中最大的结点
max = c1;
}
if (c2 < n && tree[c2] > tree[max]) {
max = c2;
}
if (max != i) { //若有调整
swap(tree, max, i);
heapify(tree, n, max); //递归继续向下调整
}
}
void build_heap(int tree[], int n) { //建堆
int last_node = n - 1;
int parent = (last_node - 1) / 2;
for (int i = parent;i >= 0;i--) {
heapify(tree, n, i);
}
}
void heap_sort(int tree[], int n) {
build_heap(tree, n);
int i;
for (i = n - 1;i >= 0;i--) {
swap(tree, i, 0); //交换最大的根节点和最后一个节点
heapify(tree, i, 0); //将最大的节点剔除(用数量减少表示,即i)
}
}
int main() {
int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
int n = 10;
printf("原始序列:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
printf("\n");
heap_sort(a, n);
printf("堆排序:");
for (int i = 0;i < 10;++i) {
printf("%3d ", a[i]);
}
return 0;
}
基数排序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 1000000000
//n的exp次方
int get_pow(int n, int exp) {
int ans = 1;
for (int i = 0;i < exp;++i) {
ans *= n;
}
return ans;
}
//获取最大位数,n位需要排n次
int get_maxexp(int a[], int size) {
int max = -INF, n = 0;
for (int i = 0;i < size;++i) {
if (a[i] > max) {
max = a[i];
}
}
while (max) {
++n;
max /= 10;
}
return n;
}
void count_sort(int a[], int size, int n, int exp) {
int barrel[10][10] = { 0 }; //二维数组记录每个桶内的数
int b_lenth[10] = { 0 }; //一维数组记录每个桶里数的个数
int x = get_pow(10, exp - 1);
for (int i = 0;i < size;++i) {
int t1 = a[i] / x % 10;
barrel[t1][b_lenth[t1]] = a[i];
b_lenth[t1]++;
}
//将0-9号桶里的数返回给a[]
int num = 0;
for (int i = 0;i <= 9;++i) {
for (int j = 0;j < b_lenth[i];++j) {
a[num++] = barrel[i][j];
}
}
}
//从倒数第一位调整至最大n位
void RadixSort(int a[], int size, int n) {
for (int i = 1;i <= n;++i) {
count_sort(a, size, n, i);
}
}
int main() {
int a[10] = { 101,983,205,43,2,777,699,32,75,8765 };
int maxexp = get_maxexp(a, 10);
printf("原始序列:");
for (int i = 0;i < 10;++i) {
printf("%5d ", a[i]);
}
printf("\n");
RadixSort(a, 10, maxexp);
printf("基数排序:");
for (int i = 0;i < 10;++i) {
printf("%5d ", a[i]);
}
return 0;
}