排序算法之快速排序

舞蹈演示排序:

冒泡排序: 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) 一般选择序列最左边的值作为支点数据。
(3) 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。
(4) 对两边利用递归排序数列。

  快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。 
2、快速排序代码实现

 package cn.com.zfc.lesson21.sort;

 /**
*
* @title QuickSort
* @describe 快速排序
* @author 张富昌
* @date 2016年10月2日下午2:45:37
*/
public class QuickSort {
  // 快速排序是平均时间最快的排序算法。
  // 基本思想:任选待排序列中的一个数据元素(通常选取第一个数据元素)作为枢轴,用它和所有的剩余元素进行比较,将所有较它小的元素排在它的前面;
  // 将所有较它大的元素排在它的后面,经过一趟排序后,可按次数据元素所在位置为界,将可序列化分成两个部分;
  // 再对这两个部分重复上述过程直至每一个部分中只剩下一个数据元素为止。   public static void main(String[] args) {
    // 声明整型数组
    int[] array = new int[10];
    // 使用循环和随机数初始化数组
    for (int i = 0; i < array.length; i++) {
      array[i] = (int) Math.round(Math.random() * 100);
    }
    System.out.println("原始数组为:");
    for (int i : array) {
      System.out.print(i + " ");
    }
    System.out.println();
    System.out.println("排序后的数组为:");
    for (int i : quickSort(array)) {
      System.out.print(i + " ");
    }
  }   /**
  *
  * 功能:对数组进行快速排序,并且返回该数组
  *
  * 参数:int[] arr
  *
  * 返回类型:int[]
  */
  public static int[] quickSort(int[] arr) {
    quickSortHelp(arr, 0, arr.length - 1);
    return arr;
  }   /**
  *
  * 功能:对数组 arr[low...high] 中的记录进行快速排序
  *
  * 参数:int[] arr, int low, int high
  *
  * 返回类型:void
  */
  public static void quickSortHelp(int[] arr, int low, int high) {
    if (low < high) {
      // 子序列 elem[low...high] 的长度大于 1
      int pivotLoc = partition(arr, low, high);
      // 对子序列 arr[low...pivotLoc-1] 递归排序
      quickSortHelp(arr, low, pivotLoc - 1);
      // 对子序列 arr[pivotLoc+1...high] 递归排序
      quickSortHelp(arr, pivotLoc + 1, high);
    }
  }   /**
  *
  * 功能:使枢轴元移到正确的位置,要求枢轴左边的元素不大于枢轴,枢轴右边的元素不小于枢轴,并返回枢轴的位置
  *
  * 参数:int[] arr, int low,int high
  *
  * 返回类型:int
  */
  public static int partition(int[] arr, int low, int high) {
    while (low < high) {
      // arr[low] 为枢轴,使 high 右边的元素不小于 elem[low]
      while (low < high && arr[high] >= arr[low]) {
        high--;
      }
      // 交换 arr[low] 和 arr[high]的值
      swap(arr, low, high);
      // arr[high] 为枢轴,使 low 左边的元素不大于 arr[high]
      while (low < high && arr[low] <= arr[high]) {
        low++;
      }
      // 交换 arr[low]和 arr[high]的值
      swap(arr, low, high);
    }
    // 返回枢轴的位置
    return low;
  }   /**
  *
  * 功能:交换两个数的值
  *
  * 参数:int x,int y
  *
  * 返回类型:void
  */
  public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
}

排序算法之快速排序Java实现的更多相关文章

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

    package com.javaTest300; public class Test039 { public static void main(String[] args) {// 快速排序 int ...

  2. 排序算法之快速排序 JAVA快速排序算法

    public static void quickSort(int[] arr, int low , int height){ int l=low, h = height; if(low < he ...

  3. Java常见排序算法之快速排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  4. Java排序算法之快速排序

    Java排序算法之快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 ...

  5. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...

  6. 排序算法总结(基于Java实现)

    前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...

  7. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  8. 八大排序算法总结与java实现(转)

    八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...

  9. 常用排序算法之——快速排序(C语言+VC6.0平台)

    经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) / ...

随机推荐

  1. MUI上拉加载下拉刷新

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. cin.get()和cin.getline()之间的区别

    cin.getline()和cin.get()都是对输入的面向行的读取,即一次读取整行而不是单个数字或字符,但是二者有一定的区别. cin.get()每次读取一整行并把由Enter键生成的换行符留在输 ...

  3. 富文本存储型XSS的模糊测试之道

    富文本存储型XSS的模糊测试之道 凭借黑吧安全网漏洞报告平台的公开案例数据,我们足以管中窥豹,跨站脚本漏洞(Cross-site Script)仍是不少企业在业务安全风险排查和修复过程中需要对抗的“大 ...

  4. 2016.08.02 math(leetcode) 小结

    math(leetcode) 小结 在leetcode中有些知识点(套路) 判断一个数是不是能被某些数整除,可以用 n%x == 0,循环除的话,就将while(n%x == 0)的循环条件设置判断整 ...

  5. sleep允许休眠, delay不允许

    在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay. 虽然msleep和mdelay都有延迟的作用,但他们是有区别的. 1.)对于模块本身 mdelay是忙 ...

  6. Tomcat安装与优化

    Tomcat安装与优化 1.安装jdk环境 最新的JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downlo ...

  7. PowerDesigner导出word模版

    模板下载 解压至:C:\Program Files (x86)\Sybase\PowerDesigner 15\Resource Files\Report Templates 即可 感谢http:// ...

  8. 网络路径查询traceroute

    Traceroute用法   网友:适兕 发布于: 2006.08.24 08:14 (共有条评论) 查看评论 | 我要评论   一.什么是Traceroute?                 In ...

  9. Code Conventions for the JavaScript Programming Language

    This is a set of coding conventions and rules for use in JavaScript programming. It is inspired by t ...

  10. ubuntu12.04安装ruby2.3

    为了搭建github-pages博客,而github-pages后端依赖于ruby,且对版本有严格要求,自己尝试了各种姿势升级ruby2.3无果,最终在查阅了各种资料之后找到一个可行方案. icebu ...