考研复试练习——bubbleSort、insertSort、selectionSort、shellSort

  • 冒泡排序

  1. 比较相邻的元素,前一个比后一个大就交换
  2. 对每一对相邻的元素做1操作
  3. 针对所有元素采取上面操作,每次循环至少会有一个元素放在排序正确的位置上
  4. 若某次循环没有做任何交换,则排序完成
void bubbleSort(int *p, int n){
	int pTemp;
	bool flag;
	for (int i = 0; i < n - 1; i++){
		flag = false;
		for (int j = 0; j < n - 1 - i; j++){
			if (p[j] > p[j + 1]){
				pTemp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = pTemp;
				flag = true;
			}
		}
		if (flag == false)
			return;
	}
}

时间复杂度:O(n^{2})    空间复杂度:O(1)    稳定

  • 直接插入排序

  1. 从第一个元素开始,该元素可以被认为是已排序
  2. 取出未排序的第一个元素,从已排序序列中从后向前扫描
  3. 如未排序元素小于已排序元素,则将已排序元素后移
  4. 重复3,直到找到正确插入的位置
  5. 重复2-4,知道序列有序
void insertSort(int *p, int n){
	int temp, pre;
	for (int i = 1; i < n; i++){
		pre = i - 1;
		temp = p[i];
		while (pre >= 0 && p[pre]>temp){
			p[pre + 1] = p[pre];
			pre--;
		}
		p[pre + 1] = temp;
	}
}

时间复杂度:O(n^{2})    空间复杂度:O(1)    稳定

  • 简单选择排序

  1. 在未排序序列中找到最小的元素,做标记
  2. 将标记的元素放入已排序序列的末尾
  3. 重复执行1、2,直到序列有序
void selectionSort(int *p, int n){
	int min, temp;
	for (int i = 0; i < n - 1; i++){
		min = i;
		for (int j = i + 1; j < n; j++){
			if (p[j]<p[min]){
				min = j;
			}
		}
		temp = p[min];
		p[min] = p[i];
		p[i] = temp;
	}
}

时间复杂度:O(n^{2})    空间复杂度:O(1)    不稳定

  • 希尔排序

简单插入排序的改进版,与简单插入排序不同之处是,希尔排序会优先比较距离比较远的元素,希尔排序又叫缩小增量排序

  1. 确定步长,将整个未排序序列分为若干个子序列
  2. 子序列分别进行直接插入排序
  3. 步长减小,再执行1、2
  4. 步长减小到1时,子序列长度变为整个序列的长度
void shellSort(int *p, int n){
	int gap = 1;
	int temp;
	int pre;
	while (gap < n / 3){
		gap = 3 * gap + 1;
	}
	gap = gap / 3;
	while (gap >= 1){
		for (int i = 0; i < n; i++){
			temp = p[i];
			pre = i - gap;
			while (pre >= 0 && p[pre]>temp){
				p[pre + gap] = p[pre];
				pre = pre - gap;
			}
			p[pre + gap] = temp;
		}
		gap--;
	}
}

时间复杂度:O(n^{1.3})    空间复杂度:O(1)    不稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值