/*数据结构 排序算法

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/***********************************************************************/
//直接插入_顺序查找法
void InsertSort(int* key, int num) {
	int i, j;
	for (i = 2; i < num+1; i++) {
		if (key[i] < key[i - 1]) {
			//先跟紧挨着待插入的比,依次往前试,直到试出
			key[0] = key[i]; //把待插入/破坏顺序的关键字kk复制为监视哨
			for (j = i - 1; key[j] > key[0]; j--) {
				//从kk往前找,找到一个适合key[0]的位置
				key[j + 1] = key[j];
			}
			key[j + 1] = key[0]; //把kk放入合适位置
		}
	}
	//return key;
}/************************************************************************/
//折半插入_折半查找法
void BI_InsertSort(int* key, int num) {
	int i, j, high, low, mid;
	for (i = 2; i < num + 1; i++) {
		if (key[i] < key[i - 1]) {
			key[0] = key[i];
			high = i - 1; low = 1;
			while (low <= high) {
				mid = (low + high) / 2;
				if (key[0] < key[mid]) {
					high = mid - 1;
				}
				else {
					low = mid + 1;
				}
			} //折半查找到合适插入位置为high+1
			for (j = i - 1; j >= high + 1; j--) {
				//往后挪
				key[j + 1] = key[j];
			}
			key[high + 1] = key[0];
		}
	}
}/*************************************************************************/
//冒泡排序
void BubbleSort(int* key, int num) {
	int i, j, tmp;
	for (i = 2; i < num+1; i++) {
		for (j = 1; j <= num - i+1; j++) {
			if (key[j+1] < key[j]) {
				tmp = key[j];
				key[j] = key[j+1];
				key[j+1] = tmp;
			}
		}
	}
}/**************************************************************************/
//快速排序找中间位置
int Partition(int* key, int low, int high) {
	key[0] = key[low];
	while (low < high) {
		//从后面找小于参考值的数,放到前面
		while (low < high&&key[high] >= key[0]) { high--; } 
		key[low] = key[high];
		//从前找大于参考值的数,放到后面
		while (low < high&&key[low] <= key[0]) { low++; } 
		key[high] = key[low];
		//空位一直在前后前后的挪动
		//直至high和low的位置重合,此位置就是中心点枢轴的位置
	}
	key[low] = key[0];
	return low;
}
//快速排序
void QuickSort(int* key, int low, int high) {
	int pivotLoc;
	if (low < high) {
		//用了递归,每次先找到枢轴位置,然后对被其分成的两个子表继续排序
		pivotLoc = Partition(key, low, high);
		QuickSort(key, low, pivotLoc - 1);
		QuickSort(key, pivotLoc + 1, high);
	}
}
/*************************************************************************/
//简单选择排序
void ChooseSort(int* key, int num) {
	int i, j, tmp;
	for (i = 1; i < num + 1; i++) {
		for (j = i + 1; j < num + 1; j++) {
			if (key[j] < key[i]) {
				tmp = key[i];
				key[i] = key[j];
				key[j] = tmp;
			}
		}
	}
}/************************************************************************/
//归并排序
//堆排序_筛选过程
void HeapAdjust(int* key, int s, int m) {
	int j;
	int rc = key[s];
	for (j = 2 * s; j <= m; j *= 2) {
		if (j < m && key[j] < key[j + 1]) { j++; }
		if (rc >= key[j]) { break; }
		key[s] = key[j];
		s = j;
	}
	key[s] = rc;
}
//堆排序_总体排序
void HeapSort(int* key, int num) {
	int i, tmp;
	for (i = num / 2; i >= 1; i--) {
		HeapAdjust(key, i, num);
	}
	for (i = num; i > 1; i--) {
		tmp = key[1];
		key[1] = key[i];
		key[i] = tmp;
		HeapAdjust(key, 1, i - 1);
	}
}
//打印排序数组
void print(int* key, int num) {
	int i = 0;
	for (i = 1; i < num + 1; i++) {
		if (i < num) {
			printf("%d ", key[i]);
		}
		else {
			printf("%d\n", key[i]);
		}
	}
}
int main() {
	int i, num;
	scanf("%d", &num);
	int* key = (int*)malloc((num + 1) * sizeof(int));
	key[0] = 0;
	for (i = 1; i < num+1; i++) {
		scanf("%d", key + i);
	}
	
	//InsertSort(key, num);
	//BI_InsertSort(key, num);
	//BubbleSort(key, num);
	//QuickSort(key, 1, num);
	//ChooseSort(key, num);
	HeapSort(key, num);
	print(key, num);
	print(key, num);
	print(key, num);
	print(key, num); 
	print(key, num);
	print(key, num);
	return 0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李 董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值