快速排序——java实现

快速排序

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

基本步骤为:
1.设定关键字,划分成两个数组,比关键字小的放在一边,大的放在另一边
2.我们选择设置数组最右端为关键字

3.递归实现快速排序,通过递归给每一个子数组快速排序

我们看个例子:

    有一组int类型数据:arr[ 6 ] = { 9 ,2 ,7 ,3 ,8 ,6 } ;

    那么进行快速排序时候:

    首先设置两个指针,从最左和最右向中间靠拢,遇到比关键字大(小)就停,然后交换位置,再继续向中间靠拢。获得排序切入点(第 i 个位置)。

    第一轮:6为关键字,进行分割数组(并不排序):(大括号里的是子串)

                {2,3}和{9,7,8}然后把6插入到中间第 i (2)位上,

         结果:{2,3},6,{9,7,8}

    第二轮:从0开始到 i 进行一次快排(选取3作为关键字);从 i +1到 arr.length - 1进行快排(选8关键字)

         结果:{2},3,6,{7},8,{9}

    第三轮结果:对3个子串再快排(同上)

         结果:2,3,6,7,8,9

快排完成。

那么接下来代码实现:(java)

//快速排序
//划分成两个数组,通过递归给每一个子数组快速排序
//1.设定关键字,比关键字小的放在一边,大的放在另一边
//2.设置数组最右端为关键字
//3.递归实现快速排序
public class QuickSort {
	
	//划分数组
	public static int part(long[] arr , int left , int right , long point) {
		//两个指针
		int leftptr = left - 1;
		int rightptr = right;
		
		while(true) {
			//从最左和最右开始找,比point大的放右边,比point小的放左边
			while(leftptr < rightptr && arr[++leftptr] < point);
			while(leftptr < rightptr && arr[--rightptr] > point);
			
			//找到后交换,然后再继续找
			if(leftptr >= rightptr) {
				break;
			} 
			else {//交换
				long tmp = arr[leftptr];
				arr[leftptr] = arr[rightptr];
				arr[rightptr] = tmp;
			}
		}
		//数组分割完毕,把关键字插入中间
		long tmp = arr[leftptr];
		arr[leftptr] = arr[right];
		arr[right] = tmp;
		
		//返回切入点位置
		return leftptr;
	}
	
	public static void sort(long[] arr , int left , int right) {
		if (right <= left) {
			return;
		}
		else {
			//设置最右为关键字
			long point = arr[right];
			//获得切入点同时划分
			int part = part(arr, left, right, point);
			//递归对左边数组排序
			sort(arr, left, part - 1);
			//右边排序
			sort(arr, part + 1, right);
		}
		
	}
	
	//打印数组
	public static void displayArr(long[] arr) {
		for(int i = 0 ; i < arr.length ; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
} 

test类:这里选取随机生成10个数字进行排序

public class TestQuickSort {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		long[] arr = new long[10];
		for(int i = 0 ; i < arr.length ; i++) {
			arr[i] = (long) (Math.random() * 99);
		}
		long point = arr[arr.length - 1];
		
		QuickSort.displayArr(arr);
		
//		QuickSort.part(arr, 0, arr.length - 1, point);
		
//		QuickSort.displayArr(arr);
		
		QuickSort.sort(arr, 0, arr.length - 1);
		
		QuickSort.displayArr(arr);
	}
}

猜你喜欢

转载自blog.csdn.net/likunkun__/article/details/80071870