快速排序算法--java

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

举例说明一下吧,这个可能不是太好理解。假设要排序的序列为

2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移

2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置

2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面

2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变

经过第一轮的快速排序,元素变为下面的样子

[1] 2 [4 9 3 6 7 5]

之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。

  1 package com.zc.manythread;
  2
  3 import java.util.Random;
  4
  5 /**
  6  * 快速排序
  7  * @author Administrator
  8  *
  9  */
 10 public class QSort {
 11     int [] date;
 12
 13     public QSort(int[] date) {
 14
 15         this.date=date;
 16
 17     }
 18     /**
 19      * 交换函数
 20      * @param a
 21      * @param i
 22      * @param j
 23      */
 24     private void swap(int a[],int i,int j) {
 25         int T;
 26         T=a[i];
 27         a[i]=a[j];
 28         a[j]=T;
 29     }
 30     /*******************
 31      * 排序函数
 32      * @param a
 33      * @param lo0
 34      * @param hi0
 35      * @return
 36      */
 37     int[] QuickSort(int a[],int lo0,int hi0){//分治法,作用就是将数组分为A[lo0..q-1] 和A[q+1..hi0]
 38         int lo=lo0;
 39         int hi=hi0;
 40         int mid;
 41         if (hi0>lo0) {
 42             mid=a[(hi0+lo0)/2];
 43             while(lo<=hi){
 44                 while((lo<hi0)&&(a[lo]<mid))  ++lo;
 45
 46                 while((hi>lo0)&&(a[hi]>mid))  --hi;
 47
 48                 if (lo<=hi) {
 49                     swap(a,lo,hi);
 50                     ++lo;
 51                     --hi;
 52                 }
 53
 54             }
 55             if (lo0<hi) {
 56                 QuickSort(a, lo0, hi);
 57             }
 58             if (lo<hi0) {
 59                 QuickSort(a, lo, hi0);
 60             }
 61         }
 62         return a;
 63     }
 64     /**************
 65      *
 66      * 创建有重复数组数据
 67      * *****************/
 68     private static int[]  createDate(int count) {
 69         int[] data=new int[count];
 70         for (int i = 0; i < data.length; i++) {
 71             data[i]=(int)(Math.random()*count);
 72         }
 73         return data;
 74     }
 75     /**
 76      * 无重复数组数据
 77      * @param count
 78      * @return
 79      */
 80     private static int[]  createDate1(int count) {
 81
 82         int[] data=new int[count];
 83           Random rand = new Random();
 84           boolean[] bool = new boolean[100];
 85           int num = 0;
 86           for (int i = 0; i < count; i++) {
 87            do {
 88             // 如果产生的数相同继续循环
 89             num = rand.nextInt(100);
 90            } while (bool[num]);
 91            bool[num] = true;
 92
 93            data[i]=num;
 94           }
 95           return data;
 96     }
 97     /**************主函数*****************/
 98     public static void main(String[] args) {
 99         final int count=10;
100         int[] data=createDate1(count);
101         for (int n:data) {
102             System.out.print(n+"\t");
103         }
104         QSort data1=new QSort(data);
105         System.out.println();
106         int[] a=data1.QuickSort(data,0, count-1);
107         for (int n:a) {
108             System.out.print(n+"\t");
109         }
110     }
111 }

结果如下:

时间: 2024-10-17 13:43:59

快速排序算法--java的相关文章

快速排序算法 java实现

1 public class QuickRank { 2 public static void main(String[] args) { 3 int[] original={26,58,1,24,75,69,32,45,841,25898}; 4 QuickRank quickRank=new QuickRank(); 5 quickRank.rankSimple(original,0,original.length-1); 6 for(int i:original) 7 System.out

[LeetCode][15]3Sum解析与快速排序算法-Java实现

Q: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. For example, given array S = [-

排序算法之 Java简单快速排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class SimpleQuick { public int[] sort(int[] arr,int left,int right){ if ( arr == null || a

java:快速排序算法与冒泡排序算法

 Java:快速排序算法与冒泡算法 首先看下,冒泡排序算法与快速排序算法的效率: 如下的是main方法: public static void main(String[] args) { //快速排序算法测试 int[] qArray = new int[100000]; for (int i = 0; i < 100000; i++){ qArray[i] = (int) (Math.random() * 100000); } long beforeQ = System.currentTi

快速排序算法(Java)

快速排序算法的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. class PartitionSort{ public void p(int[] a){ //打印输出结果 for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); } public int Parti

java算法系列之一:快速排序算法

1.算法概念. 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出. 2.算法思想. 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 3.实现思路. ①以第一个关键字 K 1 为控制字,将 [K 1 ,K 2 ,-,K n ] 分成两个子区,使左区所有关键字小于等于 K 1 ,右区所有关键字大于

Java快速排序算法

快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 用一个算法排序图形象表示了快速排序 一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键

数据结构之排序算法Java实现(4)—— 交换类排序之快速排序算法

快速排序算法属于"交换类"的排序,它的效率主要跟数据分布是否对称有关. 升序排序: /** * 快速排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { if(data == null || data.length <= 1){ return; } partitionSortByAsc(data, 0, data.length -

Java 快速排序算法的简单说明及实现

快速排序是对冒泡排序的一种改进.其基本思想是基于分治法的:在待排序表L[1...n]中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-1]中所有元素小于pivot,L[k+1...n]中所有元素大于或等于pivot,则pivot放在最终位置L(k)上,这个过程称一趟快速排序.而后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终的位置上. 首先假设划分算法已知,记为pa