数据结构总结与实现:快速排序
快速排序种类有很多,但核心思想是分治法,过程大致如下:
- 找到第一个元素(作为基准数)的位置(通过首尾标志与基准数交换的方法)
- 根据该基准数位置进行分块,分成两块,用递归的思想改变首尾标志再次排序,直到分完。
代码如下:
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<time.h>
using namespace std;
void Quicksort(int *p, int a, int b)
{
int a1 = a, b1 = b;
while (a < b)
{
bool flag = false; //注意这种标志位方法,想让程序判断是否进入过判断,很常用的方法,
//如果想让程序判断是否进入过循环,可以设置一个变量n在循环体内部,每次加一,最后看它为几就是进入了几次。
while (!flag && a<b) { //有时候分析不清条件的时候,就仔细想想是要两个成立还是任意一个就可以,两个就一定是&&,然后再考虑非不非的事情。
if (p[a] > p[b])
{
flag = true;
int temp = p[a];
p[a] = p[b];
p[b] = temp;
}
else
b--;
}
flag = false;
while (!flag && a<b) {
if (p[a] > p[b])
{
flag = true;
int temp = p[a];
p[a] = p[b];
p[b] = temp;
}
else
a++;
}
if (a - 1 > a1)
Quicksort(p, a1, a - 1);
if (a + 1 < b1)
Quicksort(p, a + 1, b1);
}
}
int main()
{
srand((int)time(0));
int n, n1;
cout << "输入随机元素个数 ";
cin >> n;
cout << "输入随机元素范围 ";
cin >> n1;
vector<int> arr(n);
int n2 = 1;
for (int i = 0; i < n; i++) //产生随机正负数
{
int n3 = (rand() % 2);
for (int j = 0; j < n3; j++) //感觉这种产生随机负数的方法很蠢,可以再想想
n2 *= -1;
arr[i] = (rand() * n2 % n1);
}
cout << endl << "随机产生的数为 " << endl;
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
Quicksort(&arr[0], 0, n - 1); //第2个参数表示第1个元素下标,第3个参数表示第2个元素下标。vector本身的标识符名虽然不是地址,但是可以通过取第一个元素地址得到首地址
cout << endl << endl << "排序后的数为 " << endl;
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
system("pause");
return 0;
}