SeniorSort 之 QuickSort

一、快速排序

核心:快排是一种采用分治思想的排序算法,大致分为三个步骤。

  1. 定基准——首先随机选择一个元素作为基准
  2. 划分区——所有比基准小的元素置于基准左侧,比基准大的元素置于右侧
  3. 递归调用——递归地调用此切分过程

二、实现

  实现方式一:

package sort;

public class QuickSort {

	public static void main(String[] args) {
		int[] unsortedArray = new int[]{6, 5, 3, 1, 8, 7, 2, 4};
		quickSort(unsortedArray);
		System.out.println("After sort: ");
		for (int item : unsortedArray) {
			System.out.print(item + " ");
		}
	}

	public static void quickSort2(int[] array, int l, int u) {
		for (int item : array) {
			System.out.print(item + " ");
		}
		System.out.println();

		if (l >= u) return ;
		int pivot = array[l] ;    // 定义一个基准,最左侧的值
		int left = l + 1 ;
		int right = u ;
		while (left <= right) {
			// 左侧内循环自增 i, 直到遇到不小于基准元素的值为止。
			while (left <= right && array[left] < pivot) {
				left++ ;
			}
			// 右侧内循环自减 j, 直到遇到小于基准元素的值为止。
			while (left <= right && array[right] >= pivot) {
				right-- ;
			}
			if (left > right) break ;
			// swap array[left] with array[right] while left <= right
			int temp = array[left] ;
			array[left] = array[right] ;
			array[right] = temp ;
		}
		/* swap the smaller with pivot */
		/**
		 * (6,5,3,1,4,2,7,8)
		 * 之后进行6和2的交换位置操作
		 * (2,5,3,1,4,6,7,8)
		 * 重复进行以上操作
		 */
		int temp = array[right] ;
		array[right] = array[l] ;
		array[l] = temp ;
//		System.out.println(l + " " + right + " " + u);   // 0 5 7
		quickSort2(array, l, right-1);
		quickSort2(array, right+1, u);
	}

	public static void quickSort(int[] array) {
		quickSort2(array, 0, array.length-1);
	}
}

  实现方式二:

public class Sort {
    public static void main(String[] args) {
        int unsortedArray[] = new int[]{6, 5, 3, 1, 8, 7, 2, 4};
        quickSort(unsortedArray);
        System.out.println("After sort: ");
        for (int item : unsortedArray) {
            System.out.print(item + " ");
        }
    }

    public static void quickSort1(int[] array, int l, int u) {
        for (int item : array) {
            System.out.print(item + " ");
        }
        System.out.println();

        if (l >= u) return;
        int m = l;
        for (int i = l + 1; i <= u; i++) {
            if (array[i] < array[l]) {
                m += 1;
                int temp = array[m];
                array[m] = array[i];
                array[i] = temp;
            }
        }
        // swap between array[m] and array[l]
        // put pivot in the mid
        int temp = array[m];
        array[m] = array[l];
        array[l] = temp;

        quickSort1(array, l, m - 1);
        quickSort1(array, m + 1, u);
    }

    public static void quickSort(int[] array) {
        quickSort1(array, 0, array.length - 1);
    }
}

  实现方式三:

package myTest;

public class ArrayIns
{
	private long[] theArray ; 		// def to array to theArray
	private int nElems ; 			// number of data items 

	public ArrayIns(int max){ 		// constructor
		theArray = new long[max] ;  // create the array
		nElems = 0 ;  				// no item yet
 	}

	public void insert(long value){	// put element into array
		theArray[nElems] = value ;	// insert it
		nElems++ ;		 			// increment size
	}

	public void display(){			// display array contents
		System.out.print("A=");
		for (int i = 0; i < nElems; i++) {			// for each element
			System.out.print(theArray[i] + " ");	// display
		}
		System.out.println("");
	}

	public void quickSort(){
		recQuickSort(0, nElems-1);
	}

	public void recQuickSort(int left, int right){
		if (right-left <= 0) {		// if size<=1
			return ;				// already sorted
		}
		else{
			long pivot = theArray[right] ;		//rightmost item

			int partition = partitionIt(left,right,pivot) ; // partition range
			recQuickSort(left, partition-1);	// sort left side
			recQuickSort(partition+1, right);	// sort right side
		}
	}

	private int partitionIt(int left, int right, long pivot) {
		int leftPtr = left-1 ; 		// left	(after ++)
		int rightPtr = right ;		// right-1 (after--)
		while (true)
		{							// find bigger item
			while (theArray[++leftPtr] < pivot)
				;
									// find smaller item
			while (rightPtr > 0 && theArray[--rightPtr] > pivot)
				;

			if (leftPtr >= rightPtr) {			// if pointers cross
				break ;							// partition done
			}
			else{								// not crossed so
				swap(leftPtr,rightPtr) ;		// swap elements
			}
		}
		swap(leftPtr,right) ;				// restore pivot
		return leftPtr ;						// return pivot location
	}

	private void swap(int dex1, int dex2) {	// swap two elements
		long temp = theArray[dex1] ;		// A into temp
		theArray[dex1] = theArray[dex2] ;	// B into A
		theArray[dex2] = temp ;				// temp into B
	}
}

  main函数:

package myTest;

public class QuickSort1
{
	public static void main(String[] args) {
		int maxSize = 18 ;		// array size
		ArrayIns arr ;
		arr = new ArrayIns(maxSize) ;	// create array 

		for (int i = 0; i < maxSize; i++) {	// fill array with random numbers
			long n = (int)(java.lang.Math.random()*99) ;
			arr.insert(n);
		}
		arr.display();
		arr.quickSort();
		arr.display();
	}
}

  部分内容参考GitHub。

时间: 2024-10-05 23:33:39

SeniorSort 之 QuickSort的相关文章

数组去重算法,quickSort

function removeRepeat(arr) { var arr2 = [] ,obj = {}; for (var i = 0; i<arr.length; i++) { var num = arr[i]; //先把arr的第[i]num if( !obj[num] ){ //如果上面有个true,那么就不要push进数组,否则就push进数组 arr2.push(num); obj[num] = true; //不要忘记push到数组以后把obj上的属性设置为true,那么下次有一样

排序算法四:快速排序(Quicksort)

快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是o(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 1 protected void quicksort(int[] array, int first, int last) { 2 3 int pivot = array[first]; 4 int i = first; 5 int j = last - 1; 6 boolean serachBig =

快速排序QuickSort

前几天实现了直接插入排序.冒泡排序和直接选择排序这三个基础排序.今天看了一下冒泡排序的改进算法,快速排序.单独记录一下,后面还有归并和基数排序等 快速排序 1.选择一个支点默认为数组第一个元素及array[start]作为支点,将所有大于支点元素的值放到支点后面,将所有小于支点元素的值放到支点前面,完成一次划分,返回支点的位置index 2.通过一个划分形成两个带排序的序列,[start, index - 1]和[index + 1, end]两个,在执行1直到序列元素只有1个则已经完成排序 具

快速排序(quicksort)

快速排序是对冒泡排序算法的一种改进型算法,而且快速排序也采用了分治法的思想.快速排序是不稳定排序, 平均时间复杂度为:O(n*logn),最坏时间复杂度为:O(n*n),空间时间复杂度:O(logn),但快速排序通常是用于排 序的最佳实用的选择. 快速排序的思想:从数组选取一个数(通常是第一个数)作为标准,从数组的高位开始查找,找到比作为标准数小的数 ,然后进行交换,又从数组的低位开始查找,找到比作为标准大的数,然后进行交换,重复以上步骤,直至从高位到低位, 低位到高位重合为止. 示例: 6  

排序--QuickSort 快排

Quick の implementation 快排,就像它的名字一定,风一样的快.基本上算是最快的排序算法了.快排的基本思想是选择一个切分的元素.把这个元素排序了.所有这个元素左边的元素都小于这个元素,所有这个元素右边的元素都大于这个元素.接着再把左右2个数组分别排序. 假设你有如下数组 (所有 i  左边的对象都小于 切分对象. 所有 j  右边的对象都大于切分对象 这句话稍后有用 先知道一下) 首先,我们把index = 0 的元素当作切分元素. 从index = 1 的位置开始,找到第一个

quicksort(java版)

相信大家都知道几种排序算法,比如说冒泡排序,选择排序,插入排序等等,这些个算法都不是很难,自己多多理解理解就能掌握了,而今天我们要谈的就是重头戏就是快速排序. 引用大牛的思想来对排序算法解释一下.(文章链接:http://bubkoo.com/2014/01/12/sort-algorithm/quick-sort/#参考文章) 快速排序是图灵奖得主C. R. A. Hoare 于 1960 年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-Conquer

【Sort】QuickSort

快速排序,平均运行时间O(N log N),最坏运行时间O(N^2). 我觉得先看Python版的快排算法(http://www.cnblogs.com/fcyworld/p/6160558.html)比较容易理解. 整体思路: 首先从数组中选出一个值pivot,然后依据这个值pivot,把数组分成大小两部分,然后再分别对这两部 分利用快排. 具体细节: 1.在具体的实现中,因为pivot的选择会对数组的划分产生很大的影响,若划分的不均衡,则极大的影响 排序时间.为了尽可能消除这种影响,同时取数

快速排序(QuickSort)

1.算法思想    快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. (2)快速排序的基本思想    设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:①分解:      在R[low..high]中任选一个记录作为基准

排序算法五:随机化快速排序(Randomized quicksort)

上一篇提到,快速排序的平均时间复杂度是O(nlgn),比其他相同时间复杂度的堆排序.归并排序都要快,但这是有前提的,就是假定要排序的序列是随机分布的,而不是有序的.实际上,对于已经排好的序列,如果用快速排序时间复杂度是O(n2).为应对这样的有序序列,于是出现了本篇要讲的随机化快速排序(Randomized quicksort). 快速排序在选主元(pivot)时,总是选择第一个:随机化快速排序的思想是,随机从序列中选择一个作为主元. (一)算法实现 1 protected void quick