快速排序--java实现

版权声明:版权归JansonLin所有,转载请标明出处。 https://blog.csdn.net/Janson_Lin/article/details/84071609

一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。

举例:

待排序数组:  2  4  6  3  1  5

第一次排序:   2  4  6  3  1  5  --->  2为基准值 向右比较

                  第一次交换后 :1  4  6  3  2  5         2>1   与1交换位置   开始向左比较

                  第二次交换后 :1  2  6  3  4  5         4>2   与4交换位置   开始向右比较    右边无比2小的数,结束第一次排序

第二次排序:1  2  6  3  4  5        以2为界,前后拆开为两个数组,在进行第一次排序的形式进行排序。

                  1  与  6  3  4  5  两个数组

代码

public class QuickSort {
	
	/**
	 * 将数组的某一段元素进行划分,小的在左边,大的在右边
	 * @param a
	 * @param start
	 * @param end
	 * @return
	 */
	public static int partition(int[] a, int start, int end){
		//每次都以最右边的元素作为基准值
		int base = a[end];
		//start一旦等于end,就说明左右两个指针合并到了同一位置,可以结束此轮循环。
		while(start < end){
			while(start < end && a[start] <= base)
				//从左边开始遍历,如果比基准值小,就继续向右走
				start++;
			//上面的while循环结束时,就说明当前的a[start]的值比基准值大,应与基准值进行交换
			if(start < end){
				//交换
				int temp = a[start];
				a[start] = a[end];
				a[end] = temp;
				//交换后,此时的那个被调换的值也同时调到了正确的位置(基准值右边),因此右边也要同时向前移动一位
				end--;
			}	
			while(start < end && a[end] >= base)
				//从右边开始遍历,如果比基准值大,就继续向左走
				end--;
			//上面的while循环结束时,就说明当前的a[end]的值比基准值小,应与基准值进行交换
			if(start < end){
				//交换
				int temp = a[start];
				a[start] = a[end];
				a[end] = temp;
				//交换后,此时的那个被调换的值也同时调到了正确的位置(基准值左边),因此左边也要同时向后移动一位
				start++;
			}	
			
		}
		//这里返回start或者end皆可,此时的start和end都为基准值所在的位置
		return end;
	}
 
	/**
	 * 排序--递归
	 * @param a
	 * @param start
	 * @param end
	 */
	public static void sort(int[] a, int start, int end){
		if(start > end){
			//如果只有一个元素,就不用再排下去了
			return;
		} 
		else{
			//如果不止一个元素,继续划分两边递归排序下去
			int partition = partition(a, start, end);
			sort(a, start, partition-1);
			sort(a, partition+1, end);
		}
			
	}

    public static void main(String[] args) {
	    int[] a = new int[]{2,7,4,5,10,1,9,3,8,6};
	    sort(a, 0, a.length-1);
	    System.out.println("排序后的结果:");
	    for(int i=0;i<a.length;i++){
		    System.out.print(a[i]+" ");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Janson_Lin/article/details/84071609