插入排序相关例题以及C++代码实现

一、冒泡排序相关

1、双向冒泡排序,正反交替冒泡(简直为了出题出题没啥意思...)

//正逆冒泡 题目 简直有病,p335,二 02
template<typename keytype>
void bubbleSort2(keytype data[], int length) {
	int flag;
	int i, j, k;
	for (i = 0, j = length - 1; i < j ;) {
		flag = false;
		for (k = i; k < j; ++k) {
			if (data[k] > data[k + 1]) {
				swap(data[k], data[k + 1]);
				flag = true;
			}
		}
		--j;//第一次没有加
		if (flag == false || i >= j) return;
		flag = false;
		for (k = j; k > i; --k) {
			if (data[k] < data[k - 1]) {
				swap(data[k], data[k - 1]);
				flag = true;
			}
		}
		++i;//额我之前这个又给忘记加了离谱
		if (flag == false || i >= j) return;
	}
}

二、快速排序相关

1、将枢轴值从第一位改成随机位(有实际意义,对于顺序逆序这种情况递归深度从o(n)能够编程o(logn)

//变成随机来玩一玩,这样其实应用时更好的吧
template<typename keyname>
void swap_r(keyname & a, keyname & b) {
	keyname temp = a;
	a = b;
	b = temp;
}

template<typename keyname>
int Partition_r(keyname data[], int low, int high) {
	if (low < high) {
		int n = rand() % (high - low + 1) + low;//小小记一下这个随机数取值和matlab不一样

		swap_r(data[low], data[n]);//这里交换的low和随机下标,不是0
		keyname pivot = data[low];
		while (low < high) {
			while (low < high && data[high] >= pivot) --high;//这些都应该时pivot不是data0哈
			data[low] = data[high];
			while (low < high && data[low] <= pivot) ++low;
			data[high] = data[low];
		}
		data[low] = pivot;
	}
	return low;
}


template<typename keyname>
void quickSort_r(keyname data[], int low, int high) {
	if (low < high) {
		int pivot = Partition_r(data, low, high);
		quickSort_r(data, low, pivot - 1);
		quickSort_r(data, pivot + 1, high);
	}
}

(看题还有一种快排的每轮操作代码表达方式,和下面的写法比较相似,之后放,计算量比这个大,因为是交换swap来的,从一头就行了)

2、特别的快排想法应用,有两种特殊的数组在利用快排的每轮左右交换的思想能够很方便的实现:

1、只有两种数字 0000011111想让0全在1前面,因为只有两种数字,在一个数通过一轮交换后,就所有数据就排好了,所以总的时间复杂度o(n)

2、有三种数字 000001111122222 让0在1前面,1在2前面如何排,同样类似的思路具体看题看下面思路

第一种,例题:

//说来惭愧看看正确答案哈,很厉害的!
template<typename keyname>
void swap(keyname& a, keyname& b) {
	keyname temp = a;
	a = b;
	b = temp;
}

template<typename keyname>
void Partition4(keyname data[], int length) {
	int i = 0, j = length - 1;
	while (i < j) {
		while (i < j && data[i] % 2 == 1) ++i;
		while (i < j && data[j] % 2 == 0) --j;
		if (i < j) {
			swap(data[i], data[j]);
		}
	}
}

第二种,例题:

 (之后再补)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值