java快速排序的两种写法

快排写法

写法一:

package quickSort;
 
public class QuickSort {
	private static int count;
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		int[] num = {3,45,78,64,52,11,64,55,99,11,18};
		System.out.println(arrayToString(num,"未排序"));
		QuickSort(num,0,num.length-1);
		System.out.println(arrayToString(num,"排序"));
		System.out.println("数组个数:"+num.length);
		System.out.println("循环次数:"+count);
		
	}
	/**
	 * 快速排序
	 * @param num	排序的数组
	 * @param left	数组的前针
	 * @param right 数组后针
	 */
	private static void QuickSort(int[] num, int left, int right) {
		//如果left等于right,即数组只有一个元素,直接返回
		if(left>=right) {
			return;
		}
		//设置最左边的元素为基准值
		int key=num[left];
		//数组中比key小的放在左边,比key大的放在右边,key值下标为i
		int i=left;
		int j=right;
		while(i<j){
			//j向左移,直到遇到比key小的值
			while(num[j]>=key && i<j){
				j--;
			}
			//i向右移,直到遇到比key大的值
			while(num[i]<=key && i<j){
				i++;
			}
			//i和j指向的元素交换
			if(i<j){
				int temp=num[i];
				num[i]=num[j];
				num[j]=temp;
			}
		}
		num[left]=num[i];
		num[i]=key;
		count++;
		QuickSort(num,left,i-1);
		QuickSort(num,i+1,right);
	}
	/**
	 * 将一个int类型数组转化为字符串
	 * @param arr
	 * @param flag
	 * @return
	 */
	private static String arrayToString(int[] arr,String flag) {
		String str = "数组为("+flag+"):";
		for(int a : arr) {
			str += a + "\t";
		}
		return str;
	}
 
}

写法二:

 /******************************************************* 
     *快速排序 (比较排序类) 
     *每次排序将待排记录分割两部分,一部分都比关键字小,一部分都比关键字大 
     ********/  
    public void quickSort(int[] L) {          
        Qsort(L,1,L.length-1);  
    }  
      
    public void Qsort(int[] L,int low,int high) {  
        int pivot;  
        if(low<high) {  
            //将L[low,high]一分为二,算出枢轴值pivot,该值得位置固定,不用再变化   
            pivot=partition0(L,low,high);  
  
            //对两边的数组分别排序  
            Qsort(L,low,pivot-1);  
            Qsort(L,pivot+1,high);            
        }                 
    }  
      
    //  选择一个枢轴值(关键字) 把它放到某个位置 使其左边的值都比它小 右边的值都比它大  
    public int partition0(int[] L,int low,int high) {  
        int pivotkey;  
        pivotkey=L[low];  
        //顺序很重要,要先从右边找
        while(low<high) {  
            while(low<high && L[high]>=pivotkey) {  //从后往前找到比key小的放到前面去  
                high--;  
            }  
            swap(L,low,high);     
            while(low<high && L[low]<=pivotkey) {  //从前往后找到比key大的 放到后面去  
                low++;  
            }  
            swap(L,low,high);  
        } //遍历所有记录  low的位置即为 key所在位置, 且固定,不用再改变  
        return low;  
    }  
 //交换数组的两个位置  
    public void swap(int[] L,int i,int j) {  
          
        int temp=L[i];  
        L[i]=L[j];  
        L[j]=temp;  
          
    }  

代码来源,节选自:

https://blog.csdn.net/qq_36186690/article/details/82470451

https://blog.csdn.net/weixin_30363263/article/details/82462088

猜你喜欢

转载自blog.csdn.net/HD243608836/article/details/88891557