博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闲来重写一下快速排序
阅读量:6787 次
发布时间:2019-06-26

本文共 3198 字,大约阅读时间需要 10 分钟。

还是写一下原理吧:

有图为证:

   

下图为原理示意图

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 arr22      *            要排序的数组23      */24     public void quickSort(int low, int high, int[] arr) {25         // 思路:26         // 2.将最左边的数的指针标记为low,将最右边的数的值栈标记为high27         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 }

 

转载于:https://www.cnblogs.com/tabchanj/p/5770897.html

你可能感兴趣的文章
使用javascript的日期函数
查看>>
c# : use xsd 校验 xml
查看>>
mybatis初接触
查看>>
没有测试的开发是多么的悲催哇
查看>>
awk的日志模块追加日期时间字段的方案
查看>>
[转]高级SQL注入:混淆和绕过
查看>>
System.IO.Path 文件名、路径、扩展名处理
查看>>
类的成员修饰符
查看>>
课堂训练
查看>>
HDU 5464:Clarke and problem
查看>>
Web服务器禁止range请求
查看>>
php编译GD库 JPEG Support
查看>>
【转】着色中的数学和物理原理
查看>>
overflow的使用
查看>>
Position Independent Code (PIC) in shared libraries on x64
查看>>
CNBLOG上几位.NET大牛的博客地址(转)
查看>>
接口继承和实现继承的区别
查看>>
spring 的自建request请求
查看>>
数组的相关知识
查看>>
Python中的logger和handler到底是个什么鬼
查看>>