zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序是用的比较多的排序算法,比如需要对“6 1 2 7 9 3 4 5 10 8”这几个数进行排序。方法是首先在这个序列中随便找一个数作为基准数。比如找 6 作为基准数,
    然后需要将这个序列中所有比基准数 6 大的数放右边,比基准数小的数放 6 的左边,类似如下排列:
    初始的状态下数字 6 在序列的第 1 位,目标是将 6 挪到中间某个位置,假如这个位置为 K,就需要寻找这个 k,然后以 k 为分界点,左边的数都小于 6,右边的数都大于等于 6。方法是从初始序列“6 1 2 7 9 3 4 5 10 8”的两端进行探测,先从右边往左找一个小于 6 的数,再从左往右找一个大于 6 的数,然后交换他们,可以用两个变量 i 和 j,分别指向最左边和最右边,刚开始让 i 指向序列最左边即(i=1),指向数字 6。让 j 指向序列最右边(j=10),指向数字 8。
    首先 j 开始出动,因为此处设置的基准数是最左边的数,所以需要 j 开始出动,一步步向左挪动,即 j--,直到找到一个小于 6 的数停下来。然后 i 开始向右挪动,即 i++,直到找到一个大于 6 的数停下来。
     
    进行交换后顺序如下:
     
    第一次交换结束,接下来 j 继续向左挪动,找到 4 比基准数小需要停下来
     

    此时基准数 6 已经归位,正好处在序列的第 6 位。已经将原来的序列以 6 为分界点拆分成了两个序列,左边的序列是“3 1 2 5 4”,右边的序列是“9 7 10 8”。
    接下来就需要分别处理这两个序列,按照刚刚的方法分别处理 6 左边和右边的序列即可。
    左边的序列是“3 1 2 5 4”,将 3 作为基准数进行调整,使得 3 左边的都是小于等于3,3 右边的都是大于等于 3。

     

     1 package day08;
     2 
     3  
     4 
     5 public class QuickSort {
     6 
     7     public static void quickSort(int[] arr, int left, int right) {
     8 
     9         int i, j, temp, t;
    10 
    11         if (left > right) {
    12 
    13             return;
    14 
    15         }
    16 
    17         i = left;
    18 
    19         j = right;
    20 
    21         //temp是基准位
    22 
    23         temp = arr[left];
    24 
    25         while (i < j) {
    26 
    27             //j从右往左依次挪动进行递减
    28 
    29             while (temp <= arr[j] && i < j) {
    30 
    31                 j--;
    32 
    33             }
    34 
    35             //i从左往右依次挪动进行递增
    36 
    37             while (temp >= arr[i] && i < j) {
    38 
    39                 i++;
    40 
    41             }
    42 
    43             //如果满足条件进行交换
    44 
    45             if (i < j) {
    46 
    47                 t = arr[j];
    48 
    49                 arr[j] = arr[i];
    50 
    51                 arr[i] = t;
    52 
    53             }
    54 
    55  
    56 
    57         }
    58 
    59         //最后将基准位与i和j相等位置的数字交换
    60 
    61         arr[left] = arr[i];
    62 
    63         arr[i] = temp;
    64 
    65         quickSort(arr, left, j - 1);
    66 
    67         quickSort(arr, j + 1, right);
    68 
    69     }
    70 
    71  
    72 
    73     public static void main(String[] args) {
    74 
    75         int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
    76 
    77         quickSort(arr, 0, arr.length - 1);
    78 
    79         for (int i = 0; i < arr.length; i++) {
    80 
    81             System.out.print(arr[i] + "	");
    82 
    83         }
    84 
    85     }
    86 
    87 }

    运行结果:

     

    欢迎批评指正,提出问题,谢谢!
  • 相关阅读:
    sql字符串函数(转)
    sqlserver 导入/导出Excel
    SelectSingleNode和SelectNodes区别
    iOS sqlite 的各种操作
    iOS 自定义的对象类型的解档和归档
    开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则
    iOS UITableView , UITableViewController ,UITableViewCell实现全国各省市遍历,选择相应的地区
    iOS 页面跳转传值,属性传值,代理传值,代码块传值,单例传值,通知传值
    iOS中的事件传递和响应者链条
    iOS开发 首次启动显示用户引导,第二次启动直接进入App,UIScrollView,UIPageControl,NSUserDefaults
  • 原文地址:https://www.cnblogs.com/xxeleanor/p/14405832.html
Copyright © 2011-2022 走看看