快速排序(Java实现)

在《算法导论》的第7章快速排序(QuiclSort)采用分治思想(Divide and Conquer)。对一个典型的子数组A[p..r]进行快速排序的三步分治过程:

  • 分解(divide):数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素都小于等于A[q],而A[q]也小于等于A[q+1..r]中的每个元素。其中,计算下标q也是划分过程的一部分。
  • 解决(Conquer):通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]进行排序。
  • 合并(Combine):因为子数组都是原址排序,所以不需要合并操作:数组A[p..r]已经有序。
1 QUICKSORT(A, p, r)
2     if p < r
3         q = PARTITION(A, p, r)
4         QUICKSORT(A, p, q-1)
5         QUICKSORT(A, q+1, r)

为了排序一个数组A的全部元素,初始调用是QUICKSORT(A, 1, A.length)。

数组的划分

算法的关键部分是PARTITION过程,它实现了对子数组A[p..r]的原址重排。

1 PARTITION(A, p, r)
2     x = A[r]
3     i = p-1
4     for j = p to r-1
5         if A[j] <= x
6             i = i+1
7             exchange A[i] with A[j]
8     exchange A[i+1] with A[r]
9     return i+1

快速排序实现:

快速排序及数组划分:QuickSort.java

 1 package quicksort;
 2
 3 public class QuickSort {
 4
 5     public void QuickSort1(int[] a, int p, int r) {
 6         if (p < r) {
 7             int q = Partition(a, p, r);
 8             QuickSort1(a, p, q-1);
 9             QuickSort1(a,q+1, r);
10         }
11     }
12
13     private int Partition(int[] A, int p, int r) {
14         int x = A[r];  //pivot = A[p]
15         int i = p-1;
16         for (int j = p; j < r; j++) {
17             if (A[j] <= x) {  //与pivot作比较
18                 i++;
19                 int tmp = A[j];
20                 A[j] = A[i];
21                 A[i] = tmp;
22             }
23         }
24
25         int tmp = A[r];
26         A[r] = A[i+1];
27         A[i+1] = tmp;
28
29         return i+1;
30
31     }
32
33 }

测试快速排序代码:QuickSortTest.java

 1 package quicksort;
 2
 3 public class QuickSortTest {
 4
 5     static int[] a ={2, 8, 7, 1, 3, 5, 6, 4};
 6 //    static int[] a ={13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11};
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9         QuickSort quickSort = new QuickSort();
10         quickSort.QuickSort1(a, 0, a.length-1);
11         for (int i = 0; i < a.length; i++) {
12             System.out.print(a[i]+" ");
13         }
14     }
15
16 }

运行结果:

1 2 3 4 5 6 7 8 
时间: 2024-08-26 18:59:52

快速排序(Java实现)的相关文章

排序算法----快速排序java

快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class test02{ public static void main(String[] args) { int n = 1; while (n != 0){ Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); int s[] = ne

插入排序,希尔排序,堆排序,归并排序,快速排序Java实现

参看:数据结构与算法分析-c语言描述 public class Main { public static void main(String[] args) { String[] a = { "a", "d", "e", "f", "m" }; String[] b = { "a", "h", "g", "l", "z&

手写快速排序(java实现)

手写快速排序(java实现) 时间复杂度: O(nlogn) 快速排序原理: 定义一个基准元素base(我这里定义的是最左面的元素定位基准元素) 定义两个变量i和j j先从右向左遍历,找到第一个比base小的数就停止 i再从左向右便利找到第一个比base大的数停止 交换i和j指向的元素 直到i和j指向同一个元素,将这个元素与基准元素交换 递归求解即可 图解:(排序过程) 注意: 上图为第一次快速排序的过程,递归过程和上图一致(没有给出) 每一次的排序结果: 现在在火车上没有给出具体每次排序结果,

随机化快速排序(Java实现)

Randomized quicksort(随机化快速排序) running time is independent of input ordering. no assumption about the input distribution.(无需对输入序列分布做任何假设) no specific input elicit the worst-case behavior.(没有特定输入引起最差的运行效率) worst-case determined only by a random -number

快速排序java代码

import java.util.Scanner; import java.util.ArrayList; public class Paixu2{ public int[] alist; //快速排序 public static void main(String args[]) { Paixu2 he=new Paixu2(); he.setup(); he.look(); he.go(0,9); he.look(); } public void setup(){ Scanner sc=new

数据结构---快速排序 &nbsp; java

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 设要排序的数组是A[0]--A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过

排序算法之快速排序(java实现)

package com.javaTest300; public class Test039 { public static void main(String[] args) {// 快速排序 int a[]={2,3,8,10,5,1,8,78,35,12}; System.out.println("----排序前-----"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" ");

排序算法之快速排序Java实现

排序算法之快速排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序:http://t.cn/hros0W  快速排序:http://t.cn/ScTA1d  归并排序:http://t.cn/Sc1cGZ 快速排序是一个就地排序,分而治之,大规模递归的算法.从本质上来说,它是归并排序的就地版本. 1.快速排序可以由下面四步组成:(1) 如果不多于1个数据,直接返回.(2

快速排序(JAVA)

package org.rev.algorithm; /**  * 快速排序 算法复杂度Ο(n log n)  *   * 1.挑出一个基准数据.  *   * 2.给数列排序,大于基准数据的放在右边,小于基准数据的放在左边.  *   * 3.递归地,对小于基准数据的子数列和大于基准数据的子数列排序.  */ public class QuickSort {   public static void main(String[] args) {     int[] data = {39, 38,