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楼
归并排序