都是网上的资源,侵删。
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。——百度
我认为比较好理解的思路:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
坑填数
1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
我自己实现的快速排序:
#include
#include
using namespace std;
void Initialize(int A[], int len)
{
for (int i = 0; i < len; i++)
{
A[i] = rand() % 100;
}
}
//快速排序
//1.先从数列中取出一个数作为基准数。
//2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
void QuickSort(int A[], int left, int right)
{
//判断排序区间知否只剩1个数,是否递归执行完毕
if (left < right)
{
//初始化数组左右指针i,j,基准值pivot = Array[left]; pivot:要填的坑
int i = left, j = right, pivot = A[i];
//
while (i < j)
{
//从右到左找第一个比基准值小的数A[j]
while (i<j && pivot<A[j])
j--;
//判断i是否该++
if (i < j)
//把这个数A[j]放入A[i]
A[i++] = A[j];
//从左到右找第一个比基准值大的数A[i]
while (i < j && pivot > A[i])
i++;
//判断j是否该--
if (i < j)
//把这个数A[j]放入A[i]
A[j--] = A[i];
}
A[i] = pivot;
QuickSort(A, left, i - 1);
QuickSort(A, i + 1, right);
}
}
int main()
{
srand((unsigned)time(NULL));
int length = 100;
int* Array = new int[length];
Initialize(Array, length);
for (int i = 0; i < length; i++)
{
cout << Array[i] << " ";
if (i != 0 && i % 10 == 0)
cout << endl;
}
//快速排序
QuickSort(Array,0,length-1);
cout << endl<<endl;
for (int i = 0; i < length; i++)
{
cout << Array[i] << " ";
if (i != 0 && i % 10 == 0)
cout << endl;
}
delete[]Array;
return 0;
}
找不到我参考的网页链接了
随机快排与快速排序区别是它的基准数取值方式:
快排基准值取 A[left]
随机快排基准值取 A[randNum]
/取得划分点
int getPivot(int a[], int left, int right) {
int pivot;
if (left < right) {
int low = left, high = right, key = a[left];
while (low < high) {
while (a[high] >= key && low < high) {
high--;
}
a[low] = a[high];
while (a[low] <= a[high] && low < high) {
low++;
}
a[high] = a[low];
}
pivot = low;
a[pivot] = key;
}
return pivot;
}
//随机快排
void randomizedQuickSort(int a[], int left, int right) {
if (left < right) {
//输入随机数种子
srand(unsigned(time(NULL)));
//生成left到right的的随机数
int randNum = rand() % (right - left + 1) + left;
//在left到right随机找一个数据作为基准点
swap(a[left], a[randNum]);
//取得划分点
int pivot = getPivot(a, left, right);
randomizedQuickSort(a, left, pivot - 1);
randomizedQuickSort(a, pivot + 1, right);
}
}