排序算法之快速排序

舞蹈演示排序:

冒泡排序: 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. Python Dict用法

    Operation Result len(a) the number of items in a 得到字典中元素的个数 a[k] the item of a with key k 取得键K所对应的值 ...

  2. .NET中如何自定义配置节点

    .NET Framework在web.config或app.config中默认提供了很多种设置,以便能够改变应用程序内嵌组件的行为,例如<connectionStrings>.<ht ...

  3. Servlet笔记6--Servlet程序改进

    第一步改进,GenericServlet: 我们目前所有放入Servlet类直接实现了javax.servlet.Servlet接口,但是这个接口中有很多方法是目前不需要的,我们可能只需要编写serv ...

  4. C# Java 加密解密

    C# AES加密解密 public static string Encrypt(string key, string clearText) { byte[] clearBytes = Encoding ...

  5. Kettle进行数据迁移(ETL)

    由于开发新的系统,需要将之前一个老的C/S应用的数据按照新的数据设计导入到新库中.此过程可能涉及到表结构不一致.大数据量(千万级,甚至上亿)等情况,包括异构数据的抽取.清洗等等工作.部分复杂的工作需要 ...

  6. mysql测试工具 -> mysqlslap

    一.简介 mysqlslap是mysql自带的基准测试工具 优点:查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比 ...

  7. git本地分支和远程分支改名

    #1 将本地分支进行改名 git branch -m old_branch new_branch #2 将远程分支的老分支删除 git push origin :old_branch #3 将改名后的 ...

  8. day04作业

    1.for(初始化表达式:条件表达式:循环后的操作表达式){ 循环体: } class Test_Sum { public static void main(String[] args) { int ...

  9. No.5 selenium学习之路之多窗口句柄

    多窗口相关操作 获取当前句柄 c_handle = driver.current_window_handle 获取所有句柄 all_handle = driver.window_handles 切换到 ...

  10. C# 在RichTextBox根据内容自动调整高度

    private void richTextBox1_ContentsResized(object sender, ContentsResizedEventArgs e)   {   richTextB ...