1.问题描述:
快速排序算法
2.分析
快速排序的关键是在需要排序的数组中选择一个数字,之后把数组分成两部分,比选取数字小的放在移动到数组的左边,比选取数字大的移动到数组的左边
3.源代码
#include <stdexcept>
#include <ctime>
#include <iostream>
using std::cout;
using std::endl;
//生成一个随机数,范围在[start,end),是一个前闭后开的区间
int RandomInRange(int start,int end)
{
return rand()%(end - start)+start;
}
//交换两个数字
void Swap(int* left,int *right)
{
*left = * left^*right;
*right = * left^*right;
*left = * left^*right;
}
//快速排序,把[start,end]分成[start,small),(small,end]两部分,前部分都比data[small]小,后置都比data[small]大
//return small
int Partition(int data[],int length,int start,int end)
{
if(data == nullptr|| length <=0||start<0||end>=length)
{
throw std::logic_error("Invaild Parameters");
}
int index = RandomInRange(start,end);;
Swap(&data[index],&data[end]);
//small在start前面一位
int small = start -1;
for(index = start;index < end;++index)
{
if(data[index] < data[end])
{
++small;
if(index !=small)
Swap(&data[index],&data[small]);
}
}
++small;
Swap(&data[small],&data[end]);
return small;
}
void QuickSort(int data[],int length,int start,int end)
{
if(start == end)
return;
int index = Partition(data,length,start,end);
if(start < index)
QuickSort(data,length,start,index-1);
if(index < end)
QuickSort(data,length,index+1,end);
}
void printData(int data[],int length)
{
for(int i=0;i<length;++i)
cout<<data[i]<<" ";
cout<<endl;
}
int main()
{
srand((unsigned)time(nullptr));
const int length = 10;
int data[length];
for(int i=0;i<length;++i)
{
data[i] = RandomInRange(1,length+4);
}
printData(data,length);
try
{
QuickSort(data,length,0,length-1);
}
catch(std::logic_error ex)
{
cout << ex.what()<<endl;
}
printData(data,length);
return 0;
}
运行结果: