#include<bits/stdc++.h>
using namespace std;
int data[15];
int m, n; //比较次数与移动次数
//产生10个随机数,封装进数组
void createData() {
//产生随机数种子
srand((int)time(NULL));
for(int i=1; i<=10; i++) {
data[i] = rand()%50;
}
}
//直接插入排序
void insertSort() {
m=n=0;
int A[15] = {0};
for(int i=1; i<=10; i++) {
A[i] = data[i];
};
for(int i=2; i<=10; i++) {
int temp = A[i];
int j = i;
//倒序,逐个移动
while(j > 1 && temp < A[j-1]) {
A[j] = A[j-1];
m++;
n++;
j--;
}
A[j] = temp;
}
cout << "插入排序:";
for(int i=1; i<=10; i++) {
cout << A[i] << " ";
}
cout << endl << "比较次数:" << m;
cout << endl << "移动次数:" << n << endl;
}
//简单选择排序
void selectSort() {
m=n=0;
//备份数据
int A[15] = {0};
for(int i=1; i<=10; i++) {
A[i] = data[i];
};
for(int i=1; i<=10; i++) {
int k = i;
for(int j=i; j<=10; j++) {
if(A[j] < A[k]) {
k = j;
}
m++;
}
if(k!=i) {
n++;
int t = A[i];
A[i] = A[k];
A[k] = t;
}
}
cout << "选择排序:";
for(int i=1; i<=10; i++) {
cout << A[i] << " ";
}
cout << endl << "比较次数:" << m;
cout << endl << "移动次数:" << n << endl;
}
void base_quickSort(int *arr, int left, int right) {
if (left > right)
{
return;
}
int i = left;
int j = right;
//取左边的为基准数
int flag = arr[left];
while(i != j){
//从右侧开始找,找到一个比标记小的数
while (arr[j] >= flag && i<j){
m++;
j--;
}
//从左侧开始找,找到一个比标记大的数
while (arr[i] <= flag && i<j)
{
m++;
i++;
}
//找好了两个要交换的数之后,交换
if (i < j){
n++;
int temp = 0;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//改变基数
arr[left] = arr[i];
arr[i] = flag;
//再进行下一轮交换
base_quickSort(arr, left, i-1);
base_quickSort(arr, i+1, right);
}
//快速排序
void quickSort() {
m=n=0;
int A[15] = {0};
for(int i=1; i<=10; i++) {
A[i] = data[i];
};
base_quickSort(A, 1, 10);
cout << "快速排序:";
for(int i=1; i<=10; i++) {
cout << A[i] << " ";
}
cout << endl << "比较次数:" << m;
cout << endl << "移动次数:" << n << endl;
}
//希尔排序
void shellSort() {
m=n=0;
int A[15] = {0};
for(int i=1; i<=10; i++) {
A[i] = data[i];
};
int tmp;
int step = 5;
while (step)
{
for (int i = step+1; i <= 10; i++)
{
tmp = A[i];
int j = i;
while (j > step && tmp < A[j - step]) //采用直接插入排序
{
m++;
n++;
A[j] = A[j - step];
j -= step;
}
A[j] = tmp;
}
step = step / 2;
}
cout << "希尔排序:";
for(int i=1; i<=10; i++) {
cout << A[i] << " ";
}
cout << endl << "比较次数:" << m;
cout << endl << "移动次数:" << n << endl;
}
int main()
{
//产生随机数
bool flag = true;
while (flag) {
createData();
cout << "产生的随机数:";
for(int i=1; i<=10; i++) {
cout << data[i] << " ";
}
cout << endl;
insertSort();
selectSort();
quickSort();
shellSort();
cout << "是否继续观测比较(Y/N) :";
char k;
cin >> k;
if(k == 'N' || k=='n') {
flag = false;
}
}
return 0;
}
不同排序算法的具体实现及比较
最新推荐文章于 2022-03-01 21:45:56 发布