插入排序(若从左到右依次递增排序)
插入排序是在一段组合数字中,从左到右找到第一个非递增函数,然后将找到的这个非递增数插入到组合序列当中。
代码如下:
#include<iostream>
using namespace std;
void InsertSort(int a[6], int len) {
int i, j;
for ( i = 2; i < len; i++) {
//如果前面的值小于后面的值
if (a[i] < a[i - 1]) {
a[0] = a[i]; //设置哨兵
for ( j = i - 1; a[0] < a[j]; j--) { //从后往前找到需要放到的位置
a[j + 1] = a[j];//向后面移动一个
}
a[j + 1] = a[0]; //赋值给正确的位置
}
}
}
//打印函数
void print(int a[6]) {
for (int i = 1; i < 6; i++) {
cout << a[i];
}
}
//主函数
int main() {
int a[6] = { 0,1,3,5,6,4 };//0的位置是哨兵,设置初始为0;
InsertSort(a, 6);
print(a);
}
1.首先将 i 的值设置为2,因为我们数组的在下标0位置是要设置哨兵的位置,第二个位置直接在循环中和第一个位置进行比较即可,依次循环
2.当找到非递增数字的时候,把这个数字复制到哨兵的位置,并设置前一个数字的下标为 j
3.这个时候我们要找到非递增数字需要插入的位置,并且将后面的数字往后移动一个下标(加1)
1)设置循环,当a[j] 恒大于a[0]的时候将 a[j] 向后移动一个位置 并把 j = j - 1
2)当不满足a[j] 恒大于a[0]的时候,就找到了需要插入的位置,把哨兵的值赋值给 a[j + 1]
这个时候插入排序就完成了。
折半排序
折半排序用到了折半查找的方法,将第2个下标放到前面的集合中(这时只有a[1] ), 根据循环将a[2]- a[n]依次放到前面的集合中
代码如下:
#include<iostream>
using namespace std;
void HalfSort(int a[6], int len) {
int i, j ,low,high,mid;//定义所需要的变量
for (i = 2; i < len; i++) {//依次向后找到需要排序的数字
a[0] = a[i];//设置哨兵
low = 1;
high = i - 1;
while (low <= high) { //折半查找
mid = (low + high) / 2;
if (a[mid] < a[0]) {
low = mid + 1;
}
else if (a[mid] > a[0]) {
high = mid - 1;
}
}
for (j = i - 1; j > high; j--) {//插入到集合当中
a[j + 1] = a[j];
}
a[high + 1] = a[0];
}
}
void print(int a[6]) {
for (int i = 1; i < 6; i++) {
cout << a[i];
}
}
int main() {
int a[6] = { 0,1,3,5,6,4 };//0的位置是哨兵,设置初始为0;
HalfSort(a, 6);
print(a);
}
1. 折半查找设置了5个变量,首先将i = 2。依次找到a[i], 并复制到哨兵给a[0],在前面的集合当中设置一个low的数组下标为1和high的数组下标等于i-1;
2.设置一个whlie循环,循环条件为low < high, 找到mid的中值,当a[mid]>a[0], 将high = mid - 1, 若a[mid]<a[0], 将low = mid + 1. 折半查找方式
3.当结束循环的时候就找到了需要插入的位置,设置j = i -1 ,(和插入排序相似) 结束的循环条件为j > high, 在循环的过程中将后面的下标向后移动一个,找到位置后a[high + 1] = a[0];
这时候折半排序就完成了。