ttpn

导航

 

归并排序

用到分治策略,先把左边和右边排序,再合并左边和右边的元素。然后递归左右子数列。

 1 class test
 2 {
 3     static int[] cell=new int[14];
 4     
 5     public static void main(String[] args) 
 6     {
 7         int i;
 8         int[] arr={1,4,8,5,2,3,7,2,10,14,11,2,16,15};
 9 
10         mergesort(arr,0,13);
11 
12         for(i=0;i<14;i++)
13           System.out.printf("%3d",arr[i]);
14         System.out.printf("\n");
15     }
16 
17     static void mergesort(int arr[],int left,int rigth)
18     {
19        int middle;
20 
21        if(left<rigth)
22        {
23           middle=(left+rigth)/2;
24           mergesort(arr,left,middle);
25           mergesort(arr,middle+1,rigth);
26           merge(arr,left,middle,rigth);
27        }
28     }
29 
30     static void merge(int[] arr,int left,int middle,int rigth)
31     {
32        int li,ri;
33        int h;
34 
35        li=left;    
36        ri=middle+1;
37        h=left;       
38 
39        while(li<=middle && ri<=rigth)  //两个数组都剩余元素,需要比较大小
40        {
41            if(arr[li]>arr[ri])
42              cell[h++]=arr[ri++];
43            else
44              cell[h++]=arr[li++];
45        }
46 
47        while(li<=middle)            //没有遍历完的数组,则直接拷贝剩下元素,因为两个数组都是有序的
48            cell[h++]=arr[li++];
49        while(ri<=rigth)
50            cell[h++]=arr[ri++];
51 
52        for(h=left;h<=rigth;h++)//把合并好的元素拷贝回原来的数组
53            arr[h]=cell[h];       
54     }
55 }

 

快速排序

确定基准数,然后把小于基准数的放在左边,大于基准数的放在右边。递归直至完成。

 1 class quick 
 2 {
 3     static void swap(int arr[],int a,int b)
 4     {
 5        int cell;
 6 
 7        cell=arr[a];
 8        arr[a]=arr[b];
 9        arr[b]=cell;
10     }
11     
12     static int median(int arr[],int left,int rigth)//先对左中右三个数进行排序
13     {
14        int middle;
15 
16        middle=(left+rigth)/2;
17        if(arr[left]>arr[middle])
18            swap(arr,left,middle);
19        if(arr[left]>arr[rigth])
20            swap(arr,left,rigth);
21        if(arr[middle]>arr[rigth])
22            swap(arr,middle,rigth);
23 
24        swap(arr,middle,rigth-1);  //隐藏基准数
25        return arr[rigth-1];       //返回基准数
26      }
27 
28     static void quicksort(int arr[],int left,int rigth)
29     {
30        int i,j;
31        int pivot;
32 
33        if(left<rigth) 
34        {  pivot=median(arr,left,rigth);    
35           i=left;
36           j=rigth-1;
37           while(i<j)
38           {               
39              while(arr[++i]<pivot){}  //在左边找比基准数大的数
40              while(arr[--j]>pivot){}  //在右边找比基准数大的数
41              if(i<j)
42                swap(arr,i,j);         //交换
43              else
44                break;
45           }
46           swap(arr,i,rigth-1);        //把基准数放回正确的位置,基准数位置确定下来了
47           quicksort(arr,left,i-1);
48           quicksort(arr,i+1,rigth);
49        }
50        else
51           return;
52     }
53 
54     public static void main(String[] args) 
55     {
56         int[] arr={1,2,1,5,4,7,8,3,6,5,7,-5};
57         int i;
58          
59         quicksort(arr,0,11);
60         for(i=0;i<12;i++)
61           System.out.printf("%3d",arr[i]);
62         System.out.printf("\n");
63     }
64 }

 

posted on 2017-02-15 22:45  Buzhou  阅读(185)  评论(0编辑  收藏  举报