快速排序

快速排序:

以第一个元素为基准,将待排序的区间分成2个子区间。将小于等于基准的元素放在左区间,大于等于基准的元素放在基右区间。对于左右子区间,递归调用前面的操作。

5、7、7、1、3

设low指向5,high指向3,设置5为基准。从hign开始向左寻找第一个小于5的元素,所以选择3

将high所指向的3赋给low指向的5得到

3、7、7、1、3

从low开始向右寻找第一个大于5的元素,所以选择7。将low所指向的7赋给high所指向的3得到

3、7、7、1、7


再从high所指向的7开始,往左寻找第一个小于5的元素,所以选择1。将high所指向的1赋给low指向的7得到

3、1、7、1、7

从low开始向右寻找第一个大于5的元素,所以选择7。将low所指向的7赋给high所指向的1得到

3、1、77、7


再从hign开始向左寻找第一个小于5的元素时,high==low。区间划分结束。将基准值赋给high所指向的位置

3、1、5、7、7

此时5左边的区间元素都小于等于5,右边的元素都大于等于5。

对左右两区间重复上次操作,即可完成排序。


#include <iostream>
#include <string>
using namespace std;

int partition(int a[] , int low , int high){
	int i = low ,j = high;
	int jizhun = a[i] ;  //定义基准
	while(i<j){
		while(i < j && a[j] >= jizhun){  //从high开始往左寻找第一个小于基准的数
			j--; 
		}
		a[i] = a[j]; //把第一个小于基准的数放在low所指的位置

		while(i < j && a[i] <= jizhun){  //从low开始往右寻找第一个大于基准的数
			i++;
		}
		a[j] = a[i]; //把第一个大于基准的数放在high所指的位置
	}

	a[i] = jizhun;  //最后i==j , i所指的位置即基准的正确位置
	return i;
}

void quickSort(int a[] , int low ,int high){
	if(low < high){
		int pos = partition(a , low , high); // 划分左右区间,并得到基准的正确位置pos
		quickSort(a , low , pos-1);  //对左区间进行划分
		quickSort(a , pos+1 , high); //对右区间进行划分
	} 
}

int main()
{
	int a[6]={9,8,7,6,5,4};
	quickSort(a,0,5);
	for(int i = 0 ; i < 6 ;i++){
		cout<<a[i]<<endl;
	}
}

平均时间复杂度:O(nlog2n)

最好时间复杂度:O(nlog2n)

最坏时间复杂度:O(n2)

是不稳定的排序,如5、7、7、1

排序后的结果为1、5、7、7

你可能感兴趣的:(快速排序)