//排序算法-------快速排序,从大到小,并跟踪做标记,程序实现
#include <iostream>
using namespace st
#define Help_Mark 50
#define Max_Mark 0x7fffffff
void print(int n, double A[])
{
for (int k = 1; k <= n; ++k)
{
cout << A[k] << " ";
}
}
void QuickSort(double A[], int s, int t,double HelpMark[]) //对A[s]到A[t]进行快速排序,HelpMark[]记录,从大到小的元素对应的标号的顺序
{
int i = s, j = t;
if (s < t)
{
double tmp = A[s]; double temp2 = HelpMark[s];
while (i != j)
{
while (A[j]<= tmp&&j>i) //若改成A[j]>= tmp就是从小到大排
{
--j;
}
A[i] = A[j]; HelpMark[i] = HelpMark[j]; //A[j]和A[i]元素怎么搞,HelpMark[]也跟着怎么搞
while (A[i]>= tmp&&i < j) //若改成A[j]<= tmp就是从小到大排
{
++i;
}
A[j] = A[i]; HelpMark[j] = HelpMark[i];
}
A[i] = tmp; HelpMark[i] = temp2;
QuickSort(A, s, i - 1, HelpMark);
QuickSort(A, i + 1, t, HelpMark);
}
}
int main()
{
int n;
cout << "请输入您要排序的数字个数" << endl;
cin >> n;
double HelpMark[100] = {0};
for (int i = 1; i <= n; ++i)
HelpMark[i] = i;
double A[100] = { 0 };
cout << "请输入要排序的数字,数字之间用空格间隔" << endl;
for (int m = 1; m <= n; ++m)
{
cin >> A[m];
}
cout << "待排序的序列是这样,您看对吗" << endl;
print(n, A); cout << endl;
QuickSort(A, 1, n, HelpMark);
print(n, A); cout << endl<<"与之对应的标号分别是: "; print(n, HelpMark);
}
(二)上述排序是以数组的第一个元素为基准的,最好能在数组随机生成一个数做基准,代码如下,着重学习
Partition()函数与C++中随机数生成方法(我的博客有专门关于随机数生成的介绍)
#include <iostream>
#include <algorithm>
using namespace std;
#define random(a,b) (rand()%(b-a+1)+a)
int Partition(int data[], int length, int start, int end)
{
if (data == NULL || length <= 0 || start<0 || end >= length)
{
cout << "输入数据有误" << endl;
exit(0);
}
int pivot = random(start, end);
swap(data[pivot], data[end]);
int small = start - 1;
for (int index = start; index<end; index++)
{
//如果index所指向的元素小于pivot枢纽元素的话,index和small游标一起向右走,当index所指向的元素大于或者等于pivot枢纽元素的话,只是index自己向右走,small不动,这样的话index走啊走啊 发现有一个小于pivot枢纽元素的时候,将此元素与small所指向的元素互换
if (data[index]<data[end])//此处若改成大于号则从大到小排
{
++small;
if (small != index)
{
swap(data[index], data[small]);
}
}
}
++small;
//最后把small所指向元素与枢纽元素pivot互换
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 (index > start)
QuickSort(data, length,start, index - 1);
if (index < end)
QuickSort(data, length, index + 1, end);
}
int main()
{
int a[10] = { 3, 1, 5, 9, 4, 8, 7, 2, 11, 15 };
QuickSort(a, 10, 0, 9);
for (int i = 0; i <= 9; ++i)
cout << a[i];
return 0;
}