#include <stdio.h>
#include <stdlib.h>
//冒泡排序,O(n2)
void bubble_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
//选择排序,O(n2)
void selection_sort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
int min = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (min != i) {
int tmp = arr[min];
arr[min] = arr[i];
arr[i] = tmp;
}
}
}
//插入排序
void insert_sort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int tmp = arr[i], j;
for (j = i-1; j >= 0 && arr[j] > tmp; j--) {
arr[j + 1] = arr[j];
}
arr[j+1] = tmp;
}
}
//希尔排序
void shell_sort(int arr[], int n) {
for (int h = n / 2; h > 0; h /= 2) {
for (int i = h; i < n; i++) {
int tmp = arr[i], j;
for (j = i - h; j >= 0 && arr[j] > tmp; j -= h) {
arr[j + h] = arr[j];
}
arr[j + h] = tmp;
}
}
}
//归并排序
//递推版
int merge_sort(int a[], int l, int r) {
if (l >= r)
return ;
int mid = l + r >> 1;
merge_sort(a, l, mid);
merge_sort(a, mid+1, r);
int k = 0, i = l, j = mid+1, tmp[r-l+1];
while (i <= mid && j <= r) {
if (a[i] <= a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while(i <= mid) {
tmp[k++] = a[i++];
}
while(j <= r) {
tmp[k++] = a[j++];
}
for (k = 0, i = l; i <= r; i++, k++)
a[i] = tmp[k];
}
// 递归版
void merge(int arr[], int reg[], int start, int end) {
if (start >= end)
return;
int len = end - start, mid = len / 2 + start;
int start1 = start, end1 = mid, start2 = mid + 1, end2 = end;
merge(arr, reg, start1, end1);
merge(arr, reg, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2)
reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
while (start1 <= end1)
reg[k++] = arr[start1++];
while (start2 <= end2)
reg[k++] = arr[start2++];
for (k = start; k <= end; k++)
arr[k] = reg[k];
}
void merge_sort2(int arr[], int n) {
int reg[100];
merge(arr, reg, 0, n - 1);
}
//快速排序
//递归版
void quick_sort(int a[], int l, int r) {
if (l >= r)
return;
int i = l-1, j = r+1, tmp = a[l+r >> 1];
while (i < j) {
do i++; while(a[i] < tmp);
do j--; while(a[j] > tmp);
if (i < j)
swap(a[i], a[j]);
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
//递推版
//略
//堆排序(小根堆)
void swap(int a[], int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void heapify(int a[], int i, int n) { //n个数
int c1 = 2 * i + 1;
int c2 = 2 * i + 2;
int min = i;
if (c1 < n && a[c1] < a[min])
min = c1;
if (c2 < n && a[c2] < a[min])
min = c2;
if (min != i) {
swap(a, i, min);
heapify(a, min, n);
}
}
void heap_sort(int a[], int n) { //n个数
for (int i = (n - 1 - 1) / 2; i >= 0; i--) {
heapify(a, i, n);
}
for (int i = n - 1; i >= 0; i--) {
swap(a, i, 0);
printf("%d\n", a[i]);
heapify(a, 0, i); //去掉一个数,剩下i个数
}
}
//
数据结构排序标准代码
最新推荐文章于 2024-05-27 09:00:00 发布