zoukankan      html  css  js  c++  java
  • 我的算法日志:排序算法之快速排序

    • 快速排序(Quicksort)是对冒泡排序的一种改进,由C. A. R.Hoare在1960年提出。
    • 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    以6、1、7、9、3、8、2、10、3、7
    这10个数为例,首先要在这个序列中随便找一个基准数(为了方便,一般都选第一个元素作为基准数),我们现以6为基准数。
    接下来操作的目的就是为了让比基准数6大的数放在6的左边,比基准数6小的数放在6的右边。

    具体的操作方法是:先从右往左找到第一个小于6的数,在从左往右找到第一个大于6的数,然后交换他们!

    java代码实现:

     1 package com.guohao.arithmetics;
     2 
     3 import java.util.Arrays;
     4 import java.util.Scanner;
     5 
     6 /**
     7  * 快速排序
     8  */
     9 public class QuickSort {
    10     public static void main(String[] args){
    11         Scanner reader = new Scanner(System.in);
    12         int n = reader.nextInt();  //待排序的元素个数
    13         int[] arr = new int[n];  //用于储存待排序元素的数组
    14 
    15         //用户从键盘输入待排序元素
    16         for (int i=0; i<n; i++){
    17             arr[i] = reader.nextInt();
    18         }
    19         reader.close();
    20 
    21         sort(arr, 0, arr.length-1);  //调用sort方法对数组arr进行排序
    22 
    23         System.out.println("排序后的数组:"+ Arrays.toString(arr));
    24     }
    25 
    26     /**
    27      * 将整型数组arr中的元素从小到大排序
    28      * @param arr
    29      * @param left
    30      * @param right
    31      */
    32     public static void sort(int[] arr, int left, int right){
    33         if(left > right){
    34             return ;
    35         }
    36 
    37         int temp = arr[left];  //基准数temp
    38         int i=left, j=right;
    39 
    40         while(i != j){
    41             while(arr[j]>=temp && i<j){  //从右向左找到一个比temp小的数,记录其下标
    42                 j--;
    43             }
    44 
    45             while(arr[i]<=temp && i<j){  //从左向右找到一个比temp大的数,记录其下标
    46                 i++;
    47             }
    48 
    49             if(i < j){  //交换两个数的位置
    50                 int t = arr[i];
    51                 arr[i] = arr[j];
    52                 arr[j] = t;
    53             }
    54         }
    55 
    56         //使基准数归位
    57         arr[left] = arr[i];
    58         arr[i] = temp;
    59 
    60         sort(arr, left, i-1);  //递归处理基准数左边的元素
    61         sort(arr, i+1, right);  //递归处理基准数右边的元素
    62     }
    63 }



  • 相关阅读:
    ubuntu 安装 Java 开发环境
    mtd-utils 的 使用
    容器技术与虚拟化技术
    Shell之作业控制
    Shell常用语句及结构
    Shell常用命令之read
    Shell之函数
    文件的copy
    类中调用初始化方法
    父类中的方法被覆盖以及子类调用父类覆盖的方法
  • 原文地址:https://www.cnblogs.com/Seraph1999/p/12728613.html
Copyright © 2011-2022 走看看