// 排序算法编程实践
#include <iostream>
#include<time.h>
#include <stdlib.h>
using namespace std;
// 冒泡排序
void BubbleSort(int a[], int n)
{
bool flag = true;
int k = n;
while (flag)
{
flag = false;
for (int i = 1; i < k; i++)
{
if (a[i - 1] > a[i]) {
swap(a[i - 1], a[i]);
flag = true;
}
}
k--;
}
}
// 直接插入排序
void Insertsort(int a[], int n)
{
int i, j;
for (i = 1; i < n; i++)
{
for (j = i - 1; j >= 0; j--)
{
if (a[j + 1] < a[j])
swap(a[j], a[j + 1]);
}
}
}
// 直接选择排序
void Selectsort(int a[], int n) {
int i, j;
for (i = 0; i < n; i++)
{
int minIndex = i;
for (j = i + 1; j < n; j++)
{
if (a[j] < a[minIndex])
{
minIndex = j;
}
}
swap(a[i], a[minIndex]);
}
}
// 归并排序(分治法)
// 将有序数组a[first...mid]和a[mid...last]合并
void MergeArray(int a[], int first, int mid, int last, int tmp[])
{
int i = first, n = mid;
int j = mid + 1, m = last;
int k = 0;
while (i <= n&&j <= m)
{
if (a[i] < a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while (i <= n)
{
tmp[k++] = a[i++];
}
while (j <= m)
tmp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = tmp[i];
}
// 先递归地分解数列,再合并数列完成归并排序
void MergesortSection(int a[], int first, int last, int tmp[])
{
if (first < last)
{
int mid = (first + last) / 2;
MergesortSection(a, first, mid, tmp); // 左边有序
MergesortSection(a, mid + 1, last, tmp); // 右边有序
MergeArray(a, first, mid, last, tmp); // 合并两个有序序列
}
}
void Mergesort(int a[], int n)
{
int *p = new int[n];
if (p == NULL)
return;
MergesortSection(a, 0, n - 1, p);
delete[] p;
}
// 快速排序
// 找中枢(挖坑填数)
int Partition(int a[], int left, int right)
{
int flag = a[left];
while (left < right)
{
while (a[right] >= flag&&left < right)
right--;
if (left < right)
{
a[left] = a[right];
left++;
}
while (a[left] < flag&&left < right)
left++;
if (left < right)
{
a[right] = a[left];
right--;
}
}
a[left] = flag;
return left;
}
void QuicksortSection(int a[], int left, int right)
{
if (left < right)
{
int i = Partition(a, left, right);
QuicksortSection(a, left, i -1);
QuicksortSection(a, i + 1, right);
}
}
void Quicksort(int a[], int n)
{
int left = 0;
int right = n - 1;
QuicksortSection(a, left, right);
}
int main()
{
int key=0;
int num=0;
cout<<"输入你要查看几个数(最大:20000):"<<endl;
cin>>num;
//加入时间计算
clock_t start,finish;
double totaltime;
int a[100000] ;
//int a[] = { 5,3,4,1,2,12,5,8,5,15,46,45,85,16,95,45,87,65,84,35};
for(int k=0;k<num;k++){
a[k]=(rand()%20000);
}
cout<<"1:冒泡排序 2:插入排序 3:选择排序 4:归并排序 5:快速排序 "<<endl;
cin>>key;
switch(key)
{
case 1:
start=clock();
BubbleSort(a, num);
finish=clock();
totaltime=(double)(finish-start);
cout<<"\n此程序的运行时间为"<<totaltime<<"ms."<<endl;
break;
case 2:
start=clock();
Insertsort(a, num);
finish=clock();
totaltime=(double)(finish-start);
cout<<"\n此程序的运行时间为"<<totaltime<<"ms."<<endl;
break;
case 3:
start=clock();
Selectsort(a, num);
finish=clock();
totaltime=(double)(finish-start);
cout<<"\n此程序的运行时间为"<<totaltime<<"ms."<<endl;
break;
case 4:
start=clock();
Mergesort(a, num);
finish=clock();
totaltime=(double)(finish-start);
cout<<"\n此程序的运行时间为"<<totaltime<<"ms."<<endl;
break;
case 5:
start=clock();
Quicksort(a, num);
finish=clock();
totaltime=(double)(finish-start);
cout<<"\n此程序的运行时间为"<<totaltime<<"ms."<<endl;
break;
}
cout<<" 显示其中100组数据:"<<endl;
for (int i = 0; i < 100; i++)
{
cout << a[i] << ",";
}
cout <<""<<endl;
return 0;
}