博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 排序(快排,归并)
阅读量:5057 次
发布时间:2019-06-12

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

Java 排序有Java.util.Arrays的sort方法,具体查看JDK API(一般都是用快排实现的,有的是用归并)

 

1 package yxy; 2  3 import java.util.Arrays; 4  5 public class Test { 6  7     public static void main(String[] args) { 8         // TODO Auto-generated method stub 9         int[] arrs = { 1,0,5,9 };10         Arrays.sort(arrs);11         for (int a : arrs) {12             System.out.print(a+"\t");13         }14     }15 }

运行结果:

0    1    5    9

但是如果我是想让从大到小排序呢,(可以逆序输出吧,一边儿呆着去,我是想让数组自己就从大到小排序)()

1 package yxy; 2  3 import java.util.Arrays; 4 import java.util.Comparator; 5  6 class DownCompare implements Comparator
{ 7 8 @Override 9 public int compare(Integer o1, Integer o2) {10 // TODO Auto-generated method stub11 // return o1==02?0:(o1

运行结果:

9    5    1    0

其实是这个方法,需要写一个类继承Comparator接口

sort(T[] a, Comparator
c) 根据指定比较器产生的顺序对指定对象数组进行排序。

 

如果说自己写快排呢

先说点儿快排稳定性的吧,快排是不稳定的,比如说 5 8(a) 8(b)  1(a) 1(b) 选5作为枢纽元素,排序后1((b)  1(a) 5 8(b)  8(a)

1 //参考:http://www.algolist.net/Algorithms/Sorting/Quicksort 2 package yxy; 3  4 class QuickSort { 5     int partition(int arr[], int left, int right) { 6         int i = left, j = right; 7         int tmp; 8         int pivot = arr[(left + right) / 2]; // 选择中间元素作为枢元 9         //若改为int pivot = left; :则 java.lang.StackOverflowError10 11         while (i < j) {                         //若改为i<=j: 则java.lang.StackOverflowError12             while (arr[i] < pivot)13                 i++;14             while (arr[j] > pivot)15                 j--;16             if (i <= j) {                     //若改为 i

对快排不熟悉,为什么改变代码会出现java.lang.StackOverflowError不清楚

 

明哥给我说的方法,很好理解(下面估计说不清,画个图看看就容易理解了),枢纽元素选择最后一个,然后2个下标指针i,s都指向开始,s的作用是指向i扫描过的第一个比枢纽元素大的位置,i扫描到比枢纽元素小的就和s位置的换,i位置比枢纽元素大的就直接i++

1 package yxy; 2  3 class QuickSort { 4  5     void quickSort(int arr[], int left, int right) { 6         if (arr == null || arr.length <= 1 || left > right) { 7             return; 8         } 9         int i = left, s = left, p = right, tmp; // p指向枢元的位置,i一直往下走,当遇到比arr[p]小的元素时和arr[s]交换10         while (i < p) {11             if (arr[i] < arr[p]) {12                 tmp = arr[i]; // 这三句,如果刚开始的元素都小于枢纽元素,则都是自己和自己交换,影响效率,可以判断i和s是否相等,相等就不交换了13                 arr[i] = arr[s];14                 arr[s] = tmp;15                 i++;16                 s++;17             } else {18                 i++;19             }20         }21         tmp = arr[s];22         arr[s] = arr[p];23         arr[p] = tmp;24         quickSort(arr, left, s - 1);25         quickSort(arr, s + 1, right);26     }27 }28 29 public class Test2 {30 31     public static void main(String[] args) {32         // TODO Auto-generated method stub33         int[] arr = { 1, 0, 5, 9 };34         new QuickSort().quickSort(arr, 0, arr.length - 1);35         for (int a : arr) {36             System.out.print(a + "\t");37         }38     }39 40 }

12、13、14和21、22、23这么写太麻烦了,写个函数吧

1     void swap(int a,int b){2         int tmp;3         tmp=a;4         b=a;5         a=tmp;6     }

哇,不行哇,哦,java传递参数的问题,记起刚学C时经常碰到这个问题了吧

1     void swap(Integer a,Integer b){2         Integer tmp;3         tmp=a;4         b=a;5         a=tmp;6     }

这个也不行

详情参考:   28楼

 

 归并排序

 

 

转载于:https://www.cnblogs.com/crane-practice/p/3675521.html

你可能感兴趣的文章
Recipe 1.4. Reversing a String by Words or Characters
查看>>
Rule 1: Make Fewer HTTP Requests(Chapter 1 of High performance Web Sites)
查看>>
sql注入
查看>>
「破解」Xposed强
查看>>
Linux 平台下 MySQL 5.5 安装 说明 与 示例
查看>>
src与href的区别
查看>>
ABAP工作区,内表,标题行的定义和区别
查看>>
《xxx重大需求征集系统的》可用性和可修改性战术分析
查看>>
Python 中 创建类方法为什么要加self
查看>>
关于indexOf的使用
查看>>
【转】JS生成 UUID的四种方法
查看>>
英语单词
查看>>
centos6.8下安装matlab2009(图片转帖)
查看>>
Mongo自动备份
查看>>
求助大神!怎样批量删除数据库表中某个字段中同样的一段字符!
查看>>
VMWARE虚拟机无法访问的三种方法分析
查看>>
enq: SQ - contention
查看>>
cer证书签名验证
查看>>
面向对象设计
查看>>
ant 安装
查看>>