zoukankan      html  css  js  c++  java
  • 闲来重写一下快速排序

    还是写一下原理吧:

    有图为证:

       

    下图为原理示意图

    package Alrithm;
    
    public class Quick {
        public static void sort(int[] arr, int low, int high) {
            int min = low;// 用于动态移动角标
            int max = high;// 用于动态移动角标
            if (low < high) {// 元素大于一个才进行排序
                int temp = arr[low];// 定义基数
                while (min < max) {// 在角标重合时跳出循环
                    // 新从最大值开始
                    while (min < max && arr[max] > temp) {// 右边的数大于基数时,max--
                        max--;
                    }
                    // 减完之后在换位置
                    int tmp = arr[min];
                    arr[min] = arr[max];
                    arr[max] = tmp;
                    // 再从最小值开始
                    while (min < max && arr[min] < temp) {
                        min++;
                    }
                    int tmp1 = arr[min];
                    arr[min] = arr[max];
                    arr[max] = tmp1;
                }
                sort(arr, low, min - 1);
                sort(arr, min + 1, high);
            }
        }
    
        public static void main(String[] args) {
            int[] arr = { 21, 32, 122, 433, 2322222, 56, 121, 565, 123 };
            sort(arr, 0, arr.length - 1);
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + ",");
            }
    
        }
    }

     如评论中所述,改进后的代码如下:

      ------在36行和42行中加入了=号-------

     1 package Alrithm;
     2 
     3 /**
     4  * 快速排序
     5  * 
     6  * @author tab
     7  */
     8 public class QuickSort {
     9     public static void main(String[] args) {
    10         QuickSort qs = new QuickSort();
    11         int[] arr = { 12, 232, 12, 12, 221212132, 12, 12, 233332, 12, 14442, 23552, 1244, 12, 33232, 1222, 12, 455232,
    12                 432212, 14465422, 232, 12, 12, 232, 12 };
    13         qs.quickSort(0, arr.length - 1, arr);
    14         for (int i = 0; i < arr.length; i++) {
    15             System.out.print(arr[i] + ",");
    16         }
    17     }
    18 
    19     /**
    20      * 
    21      * @param arr
    22      *            要排序的数组
    23      */
    24     public void quickSort(int low, int high, int[] arr) {
    25         // 思路:
    26         // 2.将最左边的数的指针标记为low,将最右边的数的值栈标记为high
    27         int i = low;
    28         int j = high;
    29         // 3.先从基数的另一边的开始和基数比较,如果该数比基数小,则角标i的表示的数和角标high表示的数交换位置,并停止,又从左边开始和基数比较
    30         // <1>首先,必须是low角标小于high角标才进行比较
    31         // <2>其次,在low角标和high角标相等时就停止第一轮比较
    32         if (low < high) {// 一轮比较开始
    33             // 1.选择一个基数,通常为左边或者右边的数
    34             int base = arr[low];// 要放在if内部,因为可能出现low大于high的情况
    35             while (i < j) {// 在i角标小于j角标时进行循环
    36                 while (base <= arr[j] && i < j) {// 循环比较右边的数(base与arr[j]比较时还要考虑相等的情况)
    37                     j--;// 如果大于基数就角标减1继续比较前一个数
    38                 }
    39                 // 在上面的循环结束即找到右边的数比左边小时,替换i和j角标对应的数,即时没找到,此时i和j相等,互换值也没问题
    40                 swap(i, j, arr);
    41                 // 同上,进行左边的数与基数的比较,小于基数则向前i++,否则互换i和j的数值,并重新开始从右边进行循环比较
    42                 while (base >= arr[i] && i < j) {
    43                     i++;
    44                 }
    45                 swap(i, j, arr);
    46             }
    47             // 当一轮执行完了以后使用递归,进行下一轮的比较
    48             quickSort(low, i - 1, arr);
    49             quickSort(i + 1, high, arr);
    50         }
    51     }
    52 
    53     public void swap(int i, int j, int[] arr) {
    54         int temp = arr[i];
    55         arr[i] = arr[j];
    56         arr[j] = temp;
    57     }
    58 }
  • 相关阅读:
    C# 关键字总结
    C# .NET、Mono、跨平台 的简单介绍
    Leetcode---剑指Offer题15---二进制中1的个数
    Leetcode---剑指Offer题14---剪绳子
    C# string方法总结
    Unity XML的使用
    C# 文件类总结 File、Directory、FileStream、StreamWriter、StreamReader
    自定义博客园---固定推荐反对到右下角
    自定义博客园---返回顶部
    CentOS 安装Python3.x常见问题
  • 原文地址:https://www.cnblogs.com/tabchanj/p/5770897.html
Copyright © 2011-2022 走看看