【C语言】27_插入排序 & 冒泡排序 & 希尔排序 & 归并排序 & 快速排序 & 选择排序 & 堆排序 & 数组打乱函数

#define SIZE(a) (sizeof(a)/sizeof(a[0]))
#define SWAP(a, b) {	\
	a += b, b = a - b, a -= b;	\
}

//打乱数组,等概率
void shuffle(int arr[], int n) {
	for (int i = 0; i < n - 1; i++) {
		int x;
		do x = rand() % (n - i) + i; while (x == i);	// [i, n-1]
		SWAP(arr[i], arr[x]);
	}
}
int main(void) {
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	print_array(arr, SIZE(arr));
	printf("\n");

	srand(time(NULL));
	shuffle(arr, SIZE(arr));
	print_array(arr, SIZE(arr));

	return 0;
}

//插入排序
void insertion_sort(int arr[], int n) {
	for (int i = 1; i < n; i++) {
		int val = arr[i];
		int j = i - 1;
		while (j >= 0 && arr[j] > val) {
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 1] = val;
		print_array(arr, n);
	}
}

//冒泡排序
void bubble_sort(int arr[], int n) {
	for (int i = 0; i < n - 1; i++) {
		bool flag = true;
		for (int j = 0; j < n - i - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				flag = false;
				SWAP(arr[j], arr[j + 1]);
			}
		}
		if (flag) break;
	}
}

//希尔排序
void shell_sort(int arr[], int n) {
	int gap = n >> 1;
	while (gap) {
		for (int i = gap; i < n; i++) {
			int value = arr[i];
			int j = i - gap;
			while (j >= 0 && arr[j] > value) {
				arr[j + gap] = arr[j];
				j -= gap;
			}
			arr[j + gap] = value;
		}
		gap >>= 1;
	}
}

//归并排序
int tmp[10];
void 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;
	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 (i = l, j = 0; i <= r; i++, j++) a[i] = tmp[j];
}

//快速排序
void quick_sort(int a[], int l, int r) {
	if (l >= r) return;
	int x = a[l + r >> 1];
	int i = l - 1, j = r + 1;
	while (i < j) {
		do i++; while (a[i] < x);
		do j--; while (a[j] > x);
		if (i < j) SWAP(a[i], a[j]);
	}
	quick_sort(a, l, j);
	quick_sort(a, j + 1, r);
}

//选择排序
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) SWAP(arr[i], arr[min]);
	}
}

//堆排序
int right;
void heap_helper(int arr[], int i) {
	int min = i;
	if (right >= 2 * i + 1 && arr[i] > arr[2 * i + 1]) min = 2 * i + 1;		//min值>左孩子,更新min
	if (right >= 2 * i + 2 && arr[min] > arr[2 * i + 2]) min = 2 * i + 2;	//min值>右孩子,更新min

	if (i != min){	//待调整点不是最小
		SWAP(arr[i], arr[min]);
		heap_helper(arr, min);
	}
}
void heap_sort(int arr[], int n) {
	right = n - 1;
	for (int i = n >> 1 - 1; i >= 0; i--) heap_helper(arr, i);

	while (n--) {
		printf("%d ", arr[0]);
		SWAP(arr[0], arr[right]);
		right--;
		heap_helper(arr, 0);
	}
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值