快速排序的奥妙

79 阅读1分钟

什么是快速排序?有多快?

快速排序:

  1. 选择一个基准元素
  2. 使用双指针,用以交换元素
  3. 比基准元素小的排到基准元素前面,比基准元素大的排到后面
  4. 每次排完,基准元素就在他最后应该在的位置

快速排序有多快?

  1. 平均时间复杂度O(nlogn)
  2. 最坏时间复杂度O(n),在正序或者逆序的情况下
  3. 最好的时间复杂度O(nlogn),在基准元素刚好为排序好后的中间元素

图示快速排序

一直移动i,j指针直到相遇 image.png 相遇后需要交换j指针指向元素和基准元素 image.png

image.png

image.png

呈上快速排序代码


//交换两数 
void swap(int *a,int *b){
	int t=*a;
	*a=*b;
	*b=t;
}

//找到基准元素所在位置并且以其为分界点分区
int partition(int arr[],int low,int high){
	int i=low+1,j=high;
	int privot=arr[low];//选择第一个元素为基准元素 
	
	while(i<j){
		while(arr[j]>privot) j--;//j比基准元素大移动不交换 
		while(arr[i]<privot) i++; //i比基准元素小移动不交换
		if(i<j) swap(&arr[i],&arr[j]);//i还是小于j则交换 
	}
	swap(&arr[low],&arr[j]);//交换基准元素 
	
	//返回基准元素最后排序完所在位置 
	return j;
}

//递归快速排序 
void quickSort(int arr[],int low,int high){
	int k;
	//当low>=high的时候就说明排序完成了 
	if(low<high){
		k=partition(arr,low,high);
		//递归两边分区 
		quickSort(arr,low,k-1);
		//k已经在他所在位置,不需要再交换了 
		quickSort(arr,k+1,high);
	}
}