快排优化---双轴快排(基于JAVA源码)---C++实现

    //随机选轴 降低原始数据排列的影响
void getTwoRandomNum(vectorarr, int left, int right) {
	if (arr.size() && left < right) {
		srand(time(0));
		int n1, n2;
		n1 = rand() % (right - left + 1) + left;
		n2 = rand() % (right - left + 1) + left;
		while (arr[n1] == arr[n2]) {
			n2 = rand() % (right - left + 1) + left;
		}
		if (arr[n2] < arr[n1]) {
			swap(arr, n1, n2);
		}
		swap(arr, right, n2);
		swap(arr, left, n1);
	}
}
// left — less表示小于lessNum less — larger表示大于lessNum小于largerNum 
//larger—right表示大于largerNum
void dualPivotQuicksort(vector& arr,int left,int right) {
    	if (arr.size() && left < right) {
    		getTwoRandomNum(arr, left, right);
    		if (arr[left] > arr[right]) {
    			swap(arr, right, left);
    		}
    		int less, larger;
    		less = left ;
    		larger = right ;
    		int i = left + 1;
    		int lessNum = arr[left];
    		int largerNum = arr[right];
    		while (i < larger) {
    			else if (arr[i] >= lessNum && arr[i] <= largerNum) {
    				i++;
    			}
    			else {
    				swap(arr, i, --larger);
    			}
    		}
    		swap(arr, left, less);
    		swap(arr, right, larger);
    		dualPivotQuicksort(arr, left, less - 1);
    		dualPivotQuicksort(arr, less+1, larger - 1);
    		dualPivotQuicksort(arr, larger+1, right);
    	}
    }

你可能感兴趣的:(c/c++面试,数据结构)