本文旨在已经理解前提下,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!";
}
}
归并排序
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
void merge(int *arry, int left, int mid, int right) {
int *temp = new int[right - left];
int t = 0;
int i = left;
int j = mid;
while (i < mid || j < right) {
if (i>= mid) { //归并段有剩余元素
temp[t++] = arry[j++];
} else if (j>= right) { //归并段有剩余元素
temp[t++] = arry[i++];
} else {
if (arry[i] < arry[j]) { //小的放前边,归并
temp[t++] = arry[i++];
} else {
temp[t++] = arry[j++];
}
}
}
t = 0;
for (int i = left; i < right; i++) {
arry[i] = temp[t++];
}
delete[] temp;
}
void mysort(int *arry, int left, int right) {
if (left + 1 < right) {
int mid = (left + right) / 2;
mysort(arry, left, mid);
mysort(arry, mid, right);
merge(arry, left, mid, right);
}
}
int main() {
const int count = 15;//测试数据个数
// int count;
// cout<<"输入·数据数"<<endl;
// cin>>count;
int *arry = new int[count];
cout<<"随机生成....";
srand(time(0));
for (int i = 0; i < count; i++) {
arry[i] = rand() % 1000;
cout << arry[i] << " ";
}
cout << endl;
mysort(arry, 0, count);//测试算法
cout<<"排序输出....";
for (int i = 0; i < count; i++) { //显示结果
cout << arry[i] << " ";
}
return 0;
}
全部代码
#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];
}
}