快速排序(比希尔排序还要快)

代码

	public static void quickSort(int[] arr,int left,int right){
		int l = left;
		int r = right;
		//pivot 中轴值
		int pivot = arr[(left + right) / 2];
		int temp = 0;
		//while循环的目的是让比pivot值小的放左边,比pivot值大的放右边
		while(l < r){
			//在pivot左边一直找,找到大于等于pivot值,才退出
			while(arr[l] < pivot){
				l += 1;
			}
			//在pivot右边一直找,找到大于等于pivot值,才退出
			while(arr[r] > pivot){
				r -= 1;
			}
			//如果l >= r,说明左边都是<=pivot的值,右边都是>=pivot的值
			if(l >= r){
				break;
			}
			//交换
			temp = arr[l];
			arr[l] = arr[r];
			arr[r] = temp;
			
			//如果交换完后,发现这个arr[l] == pivot,那么r前移
			if(arr[l] == pivot){
				r -= 1;
			}
			//如果交换完后,发现这个arr[r] == pivot,那么l后移
			if(arr[r] == pivot){
				l += 1;
			}
		}
		
		//不判断,出现栈溢出
		if(l == r){
			l += 1;
			r -= 1;
		}
		//向左递归
		if(left < r){
			quickSort(arr, left, r);
		}
		//向右递归
		if(right > l){
			quickSort(arr, l, right);
		}
	}

效率

	//8000 0000 17781ms
	//800 0000 1632ms
	//80 0000 154ms
	//8 0000 27ms
posted @ 2021-09-15 16:49  卡卡罗特琪琪  阅读(53)  评论(0编辑  收藏  举报