前面所讲的冒泡、插入和选择排序,因为平均时间复杂度为o(n^2),所以仅仅适合小数据量的排序工作。在数据量比较大时,平均时间复杂度为o(nlogn)的归并和快排就派上用场了,下面分别介绍归并排序和快速排序。
class solution{
public void mergeSort(int[]a, n){
mergeSortC(a, 0, n-1)
};
public void mergeSortC(int[]a, int p, int r){
if(p>=r) return;
int q = (p+r)/2;
//递归归并排序
mergeSortC(a, p, q);
mergeSortC(a, q+1, r);
merge(a,p,q,r);
};
public void merge(int[]a, int p, int q,int r){
int[] temp = new int[r-p];
int i=p, j=q+1,k=0;
while(i<=q && j<=r){
if(a[i]<=a[j]){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
//判断那个子数组有剩余数据
int start = i, end = q;
if(j<=r){
start = j;
end = r;
}
//将剩余的数据拷贝到临时数组
while(start<=end){
temp[k++] = a[start++];
}
for(int m=0; m
class Solution{
public void quickSort(int[]a, int n){
quickSortC(a, 0, n-1);
};
//实现快排的主函数
public void quickSortC(int[]a, int p, int r){
if(p>=r) return; //递归终止条件
q = partition(a, p, r);
quickSortC(a, p, q-1);
quickSortC(a, q+1, r);
};
//partition分割函数
public int partition(int[]a, int p, int r){
int pivot = a[r];
//将整个数组分为两个部分,左半部分小于pivot,右半部分大于pivot
int i = p;
for(int j=p; j
class Solution{
public void quickSort(int[]a, int n){
quickSortC(a, 0, n-1);
};
public void quickSortC(int[]a, int p, int r){
int low = p;
int high = r;
int pivot = a[low]; //选择最左端点的值为轴枢值
while(low=pivot){
high--;
}
a[low] = a[high];
while(low p+1){
quickSortC(a, p, low-1);
}
if(high < r-1){
quickSortC(a, high+1, r);
}
};
}
class Solution {
//基于快速排序partition方法的实现
public int findKthLargest(int[] nums, int k) {
int len = nums.length; //得出数组的长度
int left = 0;
int right = len -1;
//将求第k大的元素转换为第k大元素的索引是len-k
int target = len-k;
while(true){
int index = partition(nums, left, right);
if(target == index){
return nums[index];
}
else if(target