归并排序
用到分治策略,先把左边和右边排序,再合并左边和右边的元素。然后递归左右子数列。
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 }