`

排序-快速排序算法

阅读更多
快速排序算法:是排序算法中最常用的算法之一。
复杂度:o(nlog2(n))
思想:随即找某一个位置的值为n,把n放在应该所在的位置index,把数组中小于n的值放在index之前,大于n的值放在index之后。然后对index之前的的数组递归以上逻辑,对index之后的数组递归以上逻辑!

实现思想:从前找到一个大于n的值的位置index1,从后找到一个小于n的值位置index2,交换index1 和 index2 的值,然后考虑把n放到应该所在的位置即可。

本算法是选择最后一个位置的值当做pivot的值。
package cn.horizon.sort;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 快速排序算法
 * 
 * @author create by [url=xinchunwang@aliyun.com]新春.王[/url] <br>
 *         date :May 27, 2013 7:47:22 AM
 */
public class QuickSort {

	public static void main(String[] args) {
		Integer[] arr = initUnSortData(100);
		quickSort(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "  ");
		}
	}

	public static void quickSort(Integer[] a) {
		quickSort(a, 0, a.length - 1);
	}

	/**
	 * 快速排序
	 * 
	 * @param a 数组a
	 * @param start 开始位置
	 * @param end   结束位置
	 */
	private static void quickSort(Integer[] a, int start, int end) {

		int left = start; // 左边界
		int right = end - 1; // 右边界

		int pivot = a[end]; // 中枢值

		while (left < right) {//确保left < right ,退出:left == right
			if (a[left] <= pivot) { //如果a[left]< pivot,那么左边界 left++
				left++;
				continue;
			}
			if (a[right] > pivot) { //如果 a[right] > pivot ,那么右边界 right --
				right--;
				continue;
			}
			/*交换位置。
			 * 注意:
			 * left++ : 因为交换后的left 就是 a[right] 对应的值,a[right] 是<= pivot。
			 * right--:因为 a[right] 对应的值是 a[left] 是> pivot*/
			swap(a, left++, right--); 
		}

		//如果left的值 小于 pivot,那么可以确认a[left] 在pivot之前,那么left++,就可以把left++的值和pivot交换了
		if (a[left] < pivot) { 
			left++;
		}
		swap(a, left, end); //把中枢值放到 left的位置 ,把left现在这个较大的值放到最后面去吧。

		if (left - 1 > start) { // pivot 的左侧排序
			quickSort(a, start, left - 1);
		}
		if (left + 1 < end) { // pivot 的右侧排序
			quickSort(a, left + 1, end);
		}
	}

	public static void swap(Integer[] a, int left, int right) {
		int temp = a[left];
		a[left] = a[right];
		a[right] = temp;
	}

	private static Integer[] initUnSortData(int size) {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < size; i++) {
			list.add(new Random(i).nextInt(i + 1));
		}
		return list.toArray(new Integer[list.size()]);
	}
}

0
5
分享到:
评论
4 楼 jfant 2013-07-22  
tan4836128 写道
你这叫排序算法?
文字描述难懂,能以简单明了的方式解释清楚么?不就是个数组升降序排序么,

int temp;
        for(int i = 0; i < arr.length; i++) {  
        	for(int y=0;y < arr.length;y++){
        		if(arr[i] < arr[y]){
        			temp = arr[y];
        			arr[y] = arr[i];
        			arr[i] = temp;
        		}
        	}
        }


这样行不行,

写那么多方法,代码风格与你的文字描述一样,繁冗拖沓,多练练吧

3 楼 qfstudying 2013-05-27  
tan4836128 写道
你这叫排序算法?
文字描述难懂,能以简单明了的方式解释清楚么?不就是个数组升降序排序么,

int temp;
        for(int i = 0; i < arr.length; i++) {  
        	for(int y=0;y < arr.length;y++){
        		if(arr[i] < arr[y]){
        			temp = arr[y];
        			arr[y] = arr[i];
        			arr[i] = temp;
        		}
        	}
        }


这样行不行,

写那么多方法,代码风格与你的文字描述一样,繁冗拖沓,多练练吧


这叫啥排序,冒泡?测试了吗?
2 楼 王新春 2013-05-27  
tan4836128 写道
你这叫排序算法?
文字描述难懂,能以简单明了的方式解释清楚么?不就是个数组升降序排序么,

int temp;
        for(int i = 0; i < arr.length; i++) {  
        	for(int y=0;y < arr.length;y++){
        		if(arr[i] < arr[y]){
        			temp = arr[y];
        			arr[y] = arr[i];
        			arr[i] = temp;
        		}
        	}
        }


这样行不行,

写那么多方法,代码风格与你的文字描述一样,繁冗拖沓,多练练吧


兄弟,我指出两点:
1、你这个是冒泡的逻辑,并且是有问题的。你的内循环y的变量每次都从头到尾。
2、这篇主要是快速排序。
文字描述难懂,主要是你没懂快速排序的逻辑。
抱歉了 兄弟!
1 楼 tan4836128 2013-05-27  
你这叫排序算法?
文字描述难懂,能以简单明了的方式解释清楚么?不就是个数组升降序排序么,

int temp;
        for(int i = 0; i < arr.length; i++) {  
        	for(int y=0;y < arr.length;y++){
        		if(arr[i] < arr[y]){
        			temp = arr[y];
        			arr[y] = arr[i];
        			arr[i] = temp;
        		}
        	}
        }


这样行不行,

写那么多方法,代码风格与你的文字描述一样,繁冗拖沓,多练练吧

相关推荐

Global site tag (gtag.js) - Google Analytics