1 //找基准 2 public static int partion(int[] array,int low,int high){//一次快排 3 int tmp=array[low]; 4 while(low < high){ 5 //从后找 6 while(low < high && array[high] >= tmp){ 7 --high; 8 } 9 if(low >= high){ 10 break; 11 }else{ 12 array[low]= array[high]; 13 } 14 //从前找 15 while(low < high && array[low] <= tmp){ 16 ++low; 17 } 18 if(low >= high){ 19 break; 20 }else{ 21 array[high]=array[low]; 22 } 23 } 24 array[low]= tmp; 25 return low; 26 } 27 //将相同元素聚集在一起 28 public static int[] focusNum(int[] array,int start,int end,int par){ 29 int tmp=0; 30 //查找范围 31 int left=par-1; 32 int right=par+1; 33 //交换的指引变量 34 int parLeft=par-1; 35 int parRight=par+1; 36 //左边找 37 for(int i=left;i >=start;i--){ 38 if(array[i]==array[par]){//遍历过程中,有与par相同的元素时 39 if(i !=parLeft){//若i 和parLeft相同,将两下标所对应的元素交换 40 tmp= array[i]; 41 array[i]= array[parLeft]; 42 array[parLeft]= tmp; 43 parLeft--; 44 }else{ 45 parLeft--; 46 } 47 } 48 } 49 //右边找 50 for(int j=right;j <=end;j++){//遍历过程中,有与par相同的元素时 51 if(array[j]==array[par]){//若i 和parRight相同,将两下标所对应的元素交换 52 if(j != parRight){ 53 tmp= array[j]; 54 array[j]= array[parRight]; 55 array[parRight]= tmp; 56 parRight++; 57 }else{ 58 parRight++; 59 } 60 } 61 } 62 int[] focus={parLeft,parRight}; 63 return focus; 64 } 65 //基准左右进行递归排序 66 public static void Quick(int[] array,int start,int end){ 67 int par= partion(array,start,end); 68 int[] brray=focusNum(array,start,end,par);//相同元素聚集在一起后,新的left和right 69 int left=brray[0]; 70 int right=brray[1]; 71 if(par > start+1){ 72 Quick(array,start,left); 73 } 74 if(par < end-1){ 75 Quick(array,right,end); 76 } 77 }
在线客服
客服咨询
官方微信
返回顶部