算法:排序和搜索

2019-04-23  本文已影响0人  Zack_H
int partition(int* nums,int start,int end){
    int pivot = nums[start];
    while (start < end){
        while (nums[end] >= pivot && start<end)
            end--;
        if (nums[end] < pivot)
            nums[start] = nums[end];
        while (nums[start] <= pivot && start<end)
            start++;
        if (nums[start] > pivot)
            nums[end] = nums[start];
    }
    nums[start] = pivot;
    return start;
}

void quick(int* nums,int start,int end){
    if (start < end){
        int k = partition(nums,start,end);
        quick(nums,start,k-1);
        quick(nums,k+1,end);
    }
}

三路排序:使用 lt、gt 分别表示小于、大于pivot值的边界,i 表示当前移动的值;将数组分成小于、等于、大于pivot的三部分,再进行递归快排。

void __quicksort3(T arr[],int l,int r){
    if(l>=r)
    return ;
    
    T v=arr[l];
    int lt=l;
    int gt=r+1;
    int i=l+1;
    while(i<gt){
        if(arr[i]<v){
            swap(arr[i],arr[lt+1]);
            lt++;
            i++;
        }
        else if(arr[i]>v){
            swap(arr[i],arr[gt-1]);
            gt--;
        }
        else
            i++;
    }
    swap(arr[l],arr[lt]);
     __quicksort3(arr,l,lt-1);
     __quicksort3(arr,gt,r);
}
// 二分查找排序数组中某元素的第一个位置
while (left <= right){
    int mid = left + (right-left)/2;
    if (nums[mid]==target){
        if (mid==0||nums[mid-1]<target){
            tl = mid;
            break;
        }else
            right = mid-1;
    }else if(nums[mid]>target){
        right = mid-1;
    }else{
        left = mid+1;
    }
}
if (tl==-1) return res;
public int findKthLargest(int[] nums, int k) {
    PriorityQueue<Integer> heap = new PriorityQueue();
    for (int i=0;i<nums.length;i++){
        if (heap.size() == k){
            if (heap.peek() < nums[i])
                heap.poll();
            else
                continue;
        }
        heap.add(nums[i]); // java PriorityQueue默认是小根堆
    }
    return heap.peek();
}
def merge(self, intervals: List[Interval]) -> List[Interval]:
    if intervals == []: return []
    intervals.sort(key=lambda p:p.start) // 先按start进行排序
    rst = []
    tmp = intervals[0]
    for i in intervals: // 遍历所有区间,若当前区间start<=所求集合已有的最末元素的end,则合并
        if i.start <= tmp.end:
            if tmp.end <= i.end:
                tmp.end = i.end
        else: // 否则将其加入所求集合
            rst.append(tmp)
            tmp = i
    rst.append(tmp)
    return rst
上一篇下一篇

猜你喜欢

热点阅读