Quick Sort(快速排序)

2021-08-14 18:57:12 字數 1363 閱讀 4584

quick sort : 時間複雜度為o(logn)

思路:參考

public void quicksort(int nums, int low, int high)

int pivot = partition(nums, low, high);

quicksort(nums, low, pivot - 1);

quicksort(nums, pivot + 1, high);

}public int partition (int nums, int low, int high)

nums[low] = nums[high];

while (low < high && nums[low] <= temp)

nums[high] = nums[low];

}//退出迴圈時,low==high,此時的位置即為pivot的位置

nums[high] = temp;

return high;

}(一)kth largest element in an array

**:class solution

private int quickselect(int nums, int start, int end, int k)

while (left <= right && nums[right] < pivot)

if (left <= right)

}if (start + k - 1 <= right)

if (start + k - 1 >= left)

return nums[right + 1];}}

(二)median of two sorted arrays

題目:求兩個已排序序列的中位數,要求時間複雜度為o(log(n + m))。若總長度為偶數,返回中間兩個數的平均值;

解答:使用與quick sort類似的思想,相當於遞迴查詢第k大的元素。比較兩個陣列的第k/2元素的大小,將較小的那個陣列前k/2的部分捨去,繼續進行查詢。如果某個陣列長度達不到 k /2, 則將另乙個陣列裡的元素捨棄(可用integer.max_value來簡化實現)。注意!!需要考慮start大小超出nums陣列長度的情況!

**:class solution else

}private int findkth(int nums1, int start1, int nums2, int start2, int k)

if (start2 >= nums2.length)

if (k == 1)

if (end1 < nums1.length)

if (end2 < nums2.length)

if (pivot1 < pivot2) else}}

快速排序 QuickSort

快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...

快速排序 quicksort

快速排序 quicksort 是分治法的典型例子,它的主要思想是將乙個待排序的陣列以陣列的某乙個元素x為軸,使這個軸的左側元素都比x大,而右側元素都比x小 從大到小排序 然後以這個x在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有乙個元素為止。快速排序演算法如下 void...

快速排序 QuickSort

1,void quicksort int a,int low,int high 這個函式是排序的遞迴部分,mid就是已經確定的基準元素的位置。2,int partition int a,int low,int high 這個函式幹了兩件事 1 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...