快速排序-Java版

快速排序(Quicksort)式对冒泡排序的一种改进,基本思想式:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序的java代码写了两个,一个式韩顺平的,另一个式自己改的(感觉更好懂,简易点。测试过很ok,是否存在其他没考虑的问题还不明确~)
1、自己改进的快排,如下:
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;
			}
			if(l>=r) {
				break;
			}
			
			//交换
			temp = arr[l];
			arr[l] = arr[r];
			arr[r] = temp;
			
		}
		
		l--;
		r++;
		//向左递归
		if (left < l) {
			quickSort(arr, left, l);
		}
		// 向右递归
		if (right > r) {
			quickSort(arr, r, right);
		}
	}
2、韩顺平的快排,如下
public static void quickSort_hanshunping(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;
			}
			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;
			}
		}
		
		//如果 l==r, 必须l++, r--, 否则会出现栈溢出
		if(l==r) {
			l += 1;
			r -= 1;
		}
		
		//向左递归
		if(left < r) {
			quickSort(arr, left, r);
		}
		//向右递归
		if(right > l) {
			quickSort(arr, l, right);
		}
	}
3、主方法如下
public static void main(String[] args) {
		int[] arr= {-9,78,8,23,-567,70,-1,900,4561};
		quickSort(arr, 0, arr.length-1);
		//quickSort_hanshunping(arr, 0, arr.length-1);
		System.out.println("arr="+Arrays.toString(arr));
	}





全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务