一、冒泡排序相关
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]);
}
}
}
第二种,例题:
(之后再补)