#include <iostream>
#include <exception>
#include <random>
#include <ctime>
using namespace std;
int RandomInRange(int start, int end)
{
if (start < 0 || end < 0)
throw new exception("无效的参数");
srand((unsigned)time(NULL));
if (start == end)
return start;
else if (start < end)
return rand() % (end - start + 1) + start;
else
return rand() % (start - end + 1) + end;
}
int Partition(int data[], int length, int start, int end)
{
if (data == nullptr || length <= 0 || start < 0 || end >= length)
throw new exception("无效的参数");
int index = RandomInRange(start, end);//随机生成一个标杆
swap(data[index], data[end]);//把标杆放在最后一位,方便遍历
int small = start - 1;
for (index = start; index < end; ++index)
{
if (data[index] < data[end])
{
small++;
if (small != index)//说明此时small和index之间有大于data[end]的元素
swap(data[index], data[small]);
}
}
small++;//此时small左边全是比data[end]小的元素,small指向了第一个比data[end]大的元素
swap(data[end], data[small]);
return small;
}
void QuickSort(int data[], int length, int start, int end)
{
if (start == end)
return;
int index = Partition(data, length, start, end);
if (index > start)
QuickSort(data, length, start, index - 1);
if (index < end)
QuickSort(data, length, index + 1, end);
}
/*******************************测试代码****************************/
int* randomData(int n)//生成一个大小为n的随机数组
{
int* data=(int*)malloc(n*sizeof(int));
srand((unsigned)time(NULL));
for (int i = 0; i < n; ++i)
{
data[i] = rand() % 100;
}
return data;
}
void ifPassed(int *data,int n)
{
for (int i = 0; i < n - 1; ++i)
{
if (data[i] > data[i + 1])
{
cout << "失败" << endl;
return;
}
}
cout << "通过" << endl;
}
void test()
{
int *data1=randomData(10);
int *data2 = randomData(10);
int *data3 = randomData(10);
cout << "未排序的数据data1:" << endl;
for (int i = 0; i < 10; ++i)
cout << data1[i] << " ";
cout << endl;
QuickSort(data1, 10, 0, 9);
cout << "排序完的数据data1:" << endl;
for (int i = 0; i < 10; ++i)
cout << data1[i] << " ";
cout << endl;
ifPassed(data1, 10);
cout << "未排序的数据data2:" << endl;
for (int i = 0; i < 10; ++i)
cout << data2[i] << " ";
cout << endl;
QuickSort(data2, 10, 0, 9);
cout << "排序完的数据data2:" << endl;
for (int i = 0; i < 10; ++i)
cout << data2[i] << " ";
cout << endl;
ifPassed(data2, 10);
cout << "未排序的数据data3:" << endl;
for (int i = 0; i < 10; ++i)
cout << data3[i] << " ";
cout << endl;
QuickSort(data3, 10, 0, 9);
cout << "排序完的数据data3:" << endl;
for (int i = 0; i < 10; ++i)
cout << data3[i] << " ";
cout << endl;
ifPassed(data3, 10);
}
int main()
{
test();
system("pause");
}
快速排序QuickSort
最新推荐文章于 2024-07-16 09:58:11 发布
