Java 排序,快排,归并

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    

但是如果我是想让从大到小排序呢,(可以逆序输出吧,一边儿呆着去,我是想让数组自己就从大到小排序)(http://luoqidunwu.iteye.com/blog/1571687

 1 package yxy;
 2 
 3 import java.util.Arrays;
 4 import java.util.Comparator;
 5 
 6 class DownCompare implements Comparator<Integer> {
 7 
 8     @Override
 9     public int compare(Integer o1, Integer o2) {
10         // TODO Auto-generated method stub
11         // return o1==02?0:(o1<o2?1:-1);
12         if (o1.intValue() < o2) {
13             return 1;
14         } else if (o1 == o2) {
15             return 0;
16         } else {
17             return -1;
18         }
19     }
20 
21 }
22 
23 public class Test {
24 
25     public static void main(String[] args) {
26         // TODO Auto-generated method stub
27         Integer[] arrs = { 1, 0, 5, 9 };
28         Arrays.sort(arrs, new DownCompare());
29         for (int a : arrs) {
30             System.out.print(a + "\t");
31         }
32     }
33 }

运行结果:

9    5    1    0    

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

sort(T[] a, Comparator<? super T> 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.StackOverflowError
10 
11         while (i < j) {                         //若改为i<=j: 则java.lang.StackOverflowError
12             while (arr[i] < pivot)
13                 i++;
14             while (arr[j] > pivot)
15                 j--;
16             if (i <= j) {                     //若改为 i<j :则java.lang.StackOverflowError
17                 tmp = arr[i];
18                 arr[i] = arr[j];
19                 arr[j] = tmp;
20                 i++;
21                 j--;
22             }
23         }
24         return i;
25     }
26 
27     void quickSort(int arr[], int left, int right) {
28         if (arr == null || arr.length <= 1)
29             return;
30         int index = partition(arr, left, right);
31         if (left < index)
32             quickSort(arr, left, index - 1);
33         if (index < right)
34             quickSort(arr, index, right);
35     }
36 }
37 
38 public class Test2 {
39 
40     public static void main(String[] args) {
41         // TODO Auto-generated method stub
42         int[] arr = { 1, 0, 5, 9 };
43         new QuickSort().quickSort(arr, 0, arr.length - 1);
44         for (int a : arr) {
45             System.out.print(a + "\t");
46         }
47     }
48 
49 }

对快排不熟悉,为什么改变代码会出现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 stub
33         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     }

这个也不行

详情参考:http://bbs.csdn.net/topics/390245117 28楼

归并排序