C++ 快速排序算法

快速排序算法最坏的时间复杂度时o(n*n),期望的运行时间为o(nlgn)。

逻辑分析:

1 先从数组中选取一个数作为基数,可随机选择;

2 将数组中大于该基数的放在该基数右边,小于该基数的放在该基数左边;

3对左右两个数组重复第二步。

代码分析

数组a[]={2,1,4,5,3,8,7,9,0,6},该数组第一次分区时,left=0,right=10,假设随机基数为a[4]=3。

首先将a[0]和a[4]互换位置,数组a[]={3,1,4,5,2,8,7,9,6,0}。

进行第一次分区:

                  i=0,j=0时,j=left,数组没有改变没有改变。

                  i=0,j=1时,a[j]=1<a[left]=3,故交换a[++i]和a[j]的位置,++i=1,故此时数组依然没有变化。

                  i=1,j=2时,a[j]=4>a[left]=3,此时数组仍然没有变化。

                  i=1,j=3时,a[j]=5>a[left]=3,此时数组仍然没有变化。

                  i=1,j=4时,a[j]=2<a[left]=3,故交换a[++i]和a[j]的位置,++i=2,数组a[]={3,1,2,5,4,8,7,9,6,0}。

                  i=2,j=5时,a[j]=8>a[left]=3,此时数组仍然没有变化。

                  i=2,j=6时,a[j]=7>a[left]=3,此时数组仍然没有变化。

                  i=2,j=7时,a[j]=9>a[left]=3,此时数组仍然没有变化。

                  i=2,j=8时,a[j]=6>a[left]=3,此时数组仍然没有变化。

                  i=2,j=9时,a[j]=0<a[left]=3,故故交换a[++i]和a[j]的位置,++i=3,数组a[]={3,1,2,0,4,8,7,9,6,5}。

                  i=3,跳出循环,交换a[i]和a[left]的位置,数组a[]={0,1,2,3,4,8,7,9,6,5。

#include<iostream>
#include<cstdlib>

using namespace std;

//交换a,b的值,注意如果漏掉&,结果不正确
void swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}

//分区  若a[j]<基数,则将a[j]的值和a[++i]交换
int partition(int a[], int left, int right)
{
	int i = left;
	for (int j = left; j < right; j++)
	{
		if (a[j] < a[left])
		{
			swap(a[++i], a[j]);
		}

	}
	swap(a[i], a[left]);
	return i;
}

//快速排序  用随机法选取任意一个数(数组内)作为基数,并将该数与a[left]互换
//递归方式,对分区数组再进行划分
void quickSort(int a[], int left, int right)
{
	if (left < right)
	{
		int i = left + rand() % (right - left);
		swap(a[i], a[left]);
		int mid = partition(a, left, right);
		quickSort(a, left, mid);
		quickSort(a, mid + 1, right);
	}

}

int main()
{
	int a[] = { 2,1,4,5,3,8,7,9,0,6 };

	quickSort(a, 0, 10);

	for (int i = 0; i < 10; i++)
	{
		cout << a[i] << "";

	}
	cout << endl;
	system("pause");
	return 0;

}

猜你喜欢

转载自blog.csdn.net/summerlq/article/details/81205712