数据结构排序标准代码

#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个数
	}
}
//
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值