C++ 快速排序&随机快速排序 学习记录

C++ 快速排序 学习记录

都是网上的资源,侵删。

快速排序算法以及其他算法的时间以及空间复杂度表格:
C++ 快速排序&随机快速排序 学习记录_第1张图片

快速排序(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);
    }
}

你可能感兴趣的:(c++经典排序算法,快速排序,c++)