版权声明:本文为博主原创文章,如需转载请注明原文链接。 https://blog.csdn.net/lewyu521/article/details/82691722
本文旨在已经理解前提下,c++实现
插入排序
// 插入排序 (默认增量排序)
template<class T>
void InsertOrder(T &a) {
if(length(a)!=0) {
int b;
int j;
for(int i= 1; i<length(a); i++) {
b= a[i]; //待插入
for(j= i; b<=a[j]; j--) {
if(a[j-1]>b) {
a[j]=a[j-1];
} else {
a[j]=b;
}
}
}
} else {
cout<<"No number!";
}
}
希尔排序
//希尔排序
template<class T>
void ShellOrder(T &a) {
if(length(a)!=0) {
int len = length(a);
int d = len;
//希尔排序的间隔
while(d > 1) {
//取上一次的二分之一
d = (d+1)>>1;
//循环到len-d即可,因为后面没有可匹配的
for (int i = 0; i < len-d; i++) {
if (a[i]>a[i+d]) { //swap(a,b){
int temp = a[i+d];// temp=a;
a[i+d] = a[i]; // a=b;
a[i] = temp; // b=temp;}
}
}
}
} else {
cout<<"No number!";
}
}
选择排序
//选择排序
template<class T>
void ChooseSort(T &a) {
int min_index;
//循环数组中所有数据
for (int i = 0; i < length(a); i++) {
min_index = i;
//获得最小值下标
for (int j = i+1; j < length(a); j++) {
if (a[j] < a[min_index])
min_index = j;
}
//将最小值与已排序好部分的下一个元素交换位置
//(实现在一个数组中完成排序,不需要重建数组)
int temp = a[i];
a[i] = a[min_index];
a[min_index] = temp;
}
}
冒泡排序
//冒泡排序
template<class T>
void BubbleSort(T &a) {
if(length(a)!=0) {
int k = length(a); //用来提高冒泡排序效率,
//指向每轮排序的最后一个交换的位置
int m;
//循环比较直到满足break;条件
while(k > 0) {
m = k;
for (int i = 0; i < m - 1; i++) {
if (a[i] > a[i + 1]) {
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
k = i;
}
}
//如果此轮没有交换的数据,说明顺序一致,直接退出。如果有,
//则m和一定不一致,则继续循环
if (m == k)
break;
}
} else {
cout<<"No number!";
}
}
归并排序
template<class T>
void Merger_sort(T &datas, int start, int end) {
//异常处理
if (length(datas) == 0) {
cout<<"接收到空数组!!"<<endl;
}
if (start >= end)
return;
//取中间位置为分割点
int mid = (start + end) >> 1;
/**
* 递归实现
* 1.递归过程直到start >= end
* 2.递归到底时,开始进行二路归并mergerSort
*/
Merger_sort(datas, start, mid);
Merger_sort(datas, mid + 1, end);
// 将两个有序序列归并为一个有序序列(二路归并)
int arr[end + 1]; // 定义一个临时数组,用来存储排序后的结果
int low = start; // 临时数组的索引
int left = start;
int center = mid + 1;
// 取出最小值放入临时数组中
while (start <= mid && center <= end) {
arr[low++] = datas[start] > datas[center] ? datas[center++] : datas[start++];
}
// 若还有段序列不为空,则将其加入临时数组末尾
while (start <= mid) {
arr[low++] = datas[start++];
}
while (center <= end) {
arr[low++] = datas[center++];
}
// 将临时数组中的值copy到原数组中
for (int i = left; i <= end; i++) {
datas[i] = arr[i];
}
//}
}
全部代码
#include<iostream>
using namespace std;
template<class T>
int length(T & arr) { //求数组length()
return sizeof(arr)/sizeof(arr[0]);
}
// 插入排序 (默认增量排序)
template<class T>
void InsertOrder(T &a) {
if(length(a)!=0) {
int b;
int j;
for(int i= 1; i<length(a); i++) {
b= a[i]; //待插入
for(j= i; b<=a[j]; j--) {
if(a[j-1]>b) {
a[j]=a[j-1];
} else {
a[j]=b;
}
}
}
} else {
cout<<"No number!";
}
}
//希尔排序
template<class T>
void ShellOrder(T &a) {
if(length(a)!=0) {
int len = length(a);
int d = len;
//希尔排序的间隔
while(d > 1) {
//取上一次的二分之一
d = (d+1)>>1;
//循环到len-d即可,因为后面没有可匹配的
for (int i = 0; i < len-d; i++) {
if (a[i]>a[i+d]) { //swap(a,b){
int temp = a[i+d];// temp=a;
a[i+d] = a[i]; // a=b;
a[i] = temp; // b=temp;}
}
}
}
} else {
cout<<"No number!";
}
}
//选择排序
template<class T>
void ChooseSort(T &a) {
if(length(a)!=0) {
int min_index;
//循环数组中所有数据
for (int i = 0; i < length(a); i++) {
min_index = i;
//获得最小值下标
for (int j = i+1; j < length(a); j++) {
if (a[j] < a[min_index])
min_index = j;
}
//将最小值与已排序好部分的下一个元素交换位置
//(实现在一个数组中完成排序,不需要重建数组)
int temp = a[i];
a[i] = a[min_index];
a[min_index] = temp;
}
} else {
cout<<"No number!";
}
}
//冒泡排序
template<class T>
void BubbleSort(T &a) {
if(length(a)!=0) {
int k = length(a); //用来提高冒泡排序效率,
//指向每轮排序的最后一个交换的位置
int m;
//循环比较直到满足break;条件
while(k > 0) {
m = k;
for (int i = 0; i < m - 1; i++) {
if (a[i] > a[i + 1]) {
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
k = i;
}
}
//如果此轮没有交换的数据,说明顺序一致,直接退出。
//如果有,则m和一定不一致,则继续循环
if (m == k)
break;
}
} else {
cout<<"No number!";
}
}
int main () {
int a[5] = {7,4,9,6,8};
int b[] = {};
// InsertOrder(a);
// ShellOrder(a);
// ChooseSort(a);
BubbleSort(a);
for(int k=0; k<length(a); k++) {
cout<<a[k];
}
cout<<endl;
// InsertOrder(b);
// ShellOrder(b);
for(int k=0; k<length(b); k++) {
cout<<b[k];
}
}