重点:插入排序、选择排序、冒泡排序、快速排序
要求:
- 被排序的对象由计算机随机生成,长度分别取20、100,500三种。
- 算法中增加比较次数和移动次数的统计功能。
- 对实验结果做比较分析。
#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;
int* randNum(int *arr,int len)
{
for (int i = 1; i <= len; i++)
{
srand((unsigned)time(NULL));
for (int i = 1; i <= len; i++)
{
arr[i] = rand() % 1000 + 1;
}
}
return arr;
}
void show(int *arr,int len)
{
for (int i = 1; i <= len; i++)
{
cout << arr[i] << "\t";
if (i% 10 == 0)
{
cout << endl;
}
}
}
//插入排序
//步骤:
//1.从第2个数字开始,将待插入的数放到arr[0]中
//2.从后往前寻找位置
//3.找到位置后,将该位置及其之后的值往后移动,将arr[0]的值放入该位置
int* insertSort(int *arr, int len)
{
int a=0, b=0;
for (int i = 2; i <= len; ++i)
{
if (arr[i]<arr[i-1]) //如果需要插入的值比较小
{
a++;
arr[0] = arr[i]; //将需要插入的值放进arr[0]中
arr[i] = arr[i-1]; //arr[i-1]的值一定是最大的,所以可以直接将它移动到arr[i]中
int j = 0;
for (j = i - 2; arr[0] < arr[j]; --j) //从i-2开始比较,找到位置后进行移动
{
b++;
//找到后,后移
arr[j + 1] = arr[j];
}
arr[j+1] = arr[0];
}
}
cout << "比较了" << a << "次," << "移动了" << b << "次。" << endl;
return arr;
}
//选择排序
//步骤:
//1.从第1个数字开始,用arr[0]来保存最小关键字的下标
//2.从i+1开始,如果该下标对应的值比最小关键字对应的还要小,就修改最小关键字
//如果最小关键字发生改变,就交换i下标对应的值和arr[0]对应的最小关键字的下标
int* selectSort(int *arr, int len)
{
int j = 0;
int a = 0, b = 0;
for (int i = 1; i < len; ++i)
{
arr[0] = i;
for (j = i + 1; j <= len; ++j)
{
if (arr[j] < arr[arr[0]])
{
a++;
arr[0] = j;
}
}
if (arr[0] != i)
{
b++;
int temp = 0;
temp = arr[arr[0]];
arr[arr[0]] = arr[i];
arr[i] = temp;
}
}
cout<< "比较了" << a << "次," << "移动了" << b << "次。" << endl;
return arr;
}
//冒泡排序
//步骤:
//1.每两个进行比较,如果后面小于前面就进行交换
int *bubbleSort(int *arr, int len)
{
int a = 0, b = 0;
for (int i = 1; i <len; i++)
{
for (int j = len; j > i; j--)
{
a++;
if (arr[j] < arr[i])
{
b++;
int temp = 0;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
cout << "比较了" << a << "次," << "移动了" << b << "次。" << endl;
return arr;
}
//快速排序
//首先需要一个找到枢轴的方法函数
//其次,找到枢轴之后需要根据枢轴将其分为左边和右边递归调用函数
//快速排序
int count1, count2;
//找到枢轴
int K(int *arr, int low, int high)
{
//这里默认low=1,high=len
//用arr[0]来保存low下标对应的值
count2++;
arr[0] = arr[low];
while (low < high)
{
//当high所对应的值小于arr[0]的时候
while (low < high&&arr[high] >= arr[0])
{
--high;
count1++;
}
arr[low] = arr[high];
count2++;
while (low < high&&arr[low] <= arr[0])
{
++low;
count1++;
}
arr[high] = arr[low];
count2++;
}
arr[low] = arr[0];
count2++;
return low;
}
//找到枢轴之后需要根据枢轴将其分为左边和右边递归调用函数
void QSort(int *arr,int low,int high)
{
if (low < high)
{
int k;
k=K(arr, low, high);
QSort(arr, low, k - 1);
QSort(arr, k + 1, high);
}
}
//快速排序
void QuickSort(int *arr,int len)
{
cout << "比较了" << count1 << "次," << "移动了" << count2 << "次。" << endl;
QSort(arr, 1, len);
}
void menu()
{
int arr1[20] = { 0 };
int arr2[100] = { 0 };
int arr3[500] = { 0 };
cout << "****************************************" << endl;
cout << "*******1.生成大小为20的随机数组*********" << endl;
cout << "*******2.生成大小为100的随机数组********" << endl;
cout << "*******3.生成大小为500的随机数组********" << endl;
cout << "*******4.显示大小为20的初始数组*********" << endl;
cout << "*******5.显示大小为100的初始数组********" << endl;
cout << "*******6.显示大小为500的初始数组********" << endl;
cout << "************7.插入排序(20)************" << endl;
cout << "************8.选择排序(20)************" << endl;
cout << "************9.冒泡排序(20)************" << endl;
cout << "************10.快速排序(20)***********" << endl;
cout << "************11.插入排序(100)**********" << endl;
cout << "************12.选择排序(100)**********" << endl;
cout << "************13.冒泡排序(100)**********" << endl;
cout << "************14.快速排序(100)**********" << endl;
cout << "************15.插入排序(500)**********" << endl;
cout << "************16.选择排序(500)**********" << endl;
cout << "************17.冒泡排序(500)**********" << endl;
cout << "************18.快速排序(500)**********" << endl;
cout << "*******19.显示大小为20的排序后数组******" << endl;
cout << "*******20.显示大小为100的排序后数组*****" << endl;
cout << "*******21.显示大小为500的排序后数组*****" << endl;
cout << "***************22.退出******************" << endl;
cout << "****************************************" << endl;
int choice;
while (1)
{
cout << "请输入你的操作:" << endl;
cin >> choice;
if (choice == 22)
break;
switch (choice)
{
case 1:
randNum(arr1, 20);
break;
case 2:
randNum(arr2, 100);
break;
case 3:
randNum(arr3, 500);
break;
case 4:
cout << "排序前:" << endl;
show(arr1, 20);
break;
case 5:
cout << "排序前:" << endl;
show(arr2, 100);
break;
case 6:
cout << "排序前:" << endl;
show(arr3, 500);
break;
case 7:
insertSort(arr1, 20);
break;
case 8:
selectSort(arr1, 20);
break;
case 9:
bubbleSort(arr1, 20);
break;
case 10:
QuickSort(arr1, 20);
break;
case 11:
insertSort(arr2, 100);
break;
case 12:
selectSort(arr2, 100);
break;
case 13:
bubbleSort(arr2, 100);
break;
case 14:
QuickSort(arr2, 100);
break;
case 15:
insertSort(arr3, 500);
break;
case 16:
selectSort(arr3, 500);
break;
case 17:
bubbleSort(arr3, 500);
break;
case 18:
QuickSort(arr3, 500);
break;
case 19:
cout << "排序后:" << endl;
show(arr1, 20);
break;
case 20:
cout << "排序后:" << endl;
show(arr2, 100);
break;
case 21:
cout << "排序后:" << endl;
show(arr3, 500);
break;
default:
break;
}
}
}
int main()
{
#if 0 //测试
randNum(arr1,20);
show(arr1,20);
#endif
/*
cout << "排序后:" << endl;
insertSort(arr1, 20);
show(arr1, 20);
*/
#if 0
selectSort(arr1, 20);
cout << endl;
show(arr1, 20);
#endif
#if 0
cout << "排序后:" << endl;
bubbleSort(arr1, 20);
show(arr1, 20);
#endif
#if 0
cout << "排序后:" << endl;
QuickSort(arr1, 20);
show(arr1, 20);
#endif
menu();
system("pause");
return 0;
}