快排归并面试算法模版实现

采用vector实现快排,堆排序,冒泡排序,二分查找等常用算法,并用string,int,double作了测试,原理网上很多,就不细说了,做了些简单注释。

https://mintlucas.github.io/2019/03/02/快排归并面试算法模版实现/

#include <bits/stdc++.h>
using namespace std;

template<typename T>
void swap1(T &a, T &b){
    T temp;
    temp = a;
    a = b;
    b = temp;
}

template<typename T>
void quickSort(vector<T> &vec,int left, int right){
    int low = left, high = right;
    if(vec.size() < 2 || low >= high)
        return;

    T key = low;
    while(low < high){
        //pivot的对立面找一个小于pivot
        while(vec[high] >= vec[key] && high > low)
            high--;
        //从左边找一个大于pivot
        while(vec[low] <= vec[key] && low < high)
            low++;
        //交换
        swap1(vec[low], vec[high]);
    }
    swap1(vec[low], vec[key]);

    //left和right不能变,此时low=high,左右分治递归下去
    quickSort(vec, left, high - 1);
    quickSort(vec, low + 1, right);
}

template<typename T>
void merge(vector<T> &vec, int left, int mid, int right){
    //假设new出来一个空数组在空数组里排序
    vector<T> temp(vec);

    int k = 0;
    int cur1 = left, cur2 = mid+1;

    //令人崩溃的大括号...把这里到return全括住了找了半天
    while(cur1 <= mid && cur2 <= right)
        if(vec[cur1] <= vec[cur2])
            temp[k++] = vec[cur1++];
        else
            temp[k++] = vec[cur2++];
    
    while(cur1 <= mid)
        temp[k++] = vec[cur1++];
    while(cur2 <= right)
        temp[k++] = vec[cur2++];

    //将空数组里的值拷贝回原数组注意考虑到右半边原数组下标需要[left+cur1]
    for (cur1 = 0; cur1 < k; cur1++)
        vec[left + cur1] = temp[cur1];

    return;    

}

template<typename T>
void bubbleSort(vector<T> &vec){
    for(int i = vec.size()-1; i >= 0; i--)
        for(int j = 0; j < i; j++)
            if(vec[j] > vec[j+1])
                swap1(vec[j], vec[j+1]);
    return;
}

template<typename T>
void mergeSort(vector<T> &vec, int left, int right){
    if(left >= right)
        return;
    
    //分解原问题为若干子问题
    int mid = left + (right - left)/2;

    //递归求解子问题,若足够小和直接求得
    mergeSort(vec, left, mid);
    mergeSort(vec, mid+1, right);

    //合并子问题的解
    merge(vec, left, mid, right);
}

template<typename T>
int binarySearch(vector<T> &vec, T key){
    if(vec.size() < 0)
        return -1;
    int low = 0;
    int high = vec.size() - 1;
    int mid = 0;
    //low=high时不能跳出,此时需要进去进行vec[mid]==key判断
    while(low <= high){
        mid = low + (high - low)/2;
        if(vec[mid] == key)
            return mid;
        if(vec[mid] < key)
            low = mid + 1;
        else
            high = mid - 1;
    }
    //没找到返回-1
    return -1;
}

int main(){
    //int a[] = {11,22,33,1,2,5};
    //double a[] = {3.0,6,3.5,4,5,3.2,3,2};
    //int a[] = {80,30,60,40,20,10,50,70};
    //vector<double> vec(a, a+8);

    //vector<double> vec = {3.0,6,3.5,4,5,3.2,3,2};在vs上出错百度是编译器问题

    //vector<int> vec1(vec);
    vector<std::string> vec;
    vec.push_back("lucas");
    vec.push_back("adam");
    vec.push_back("ardark");

    //for(int i = 0; i < 3; i++)
     //   vec.push_back(i);
    //swap1(vec[0], vec[1]);

    mergeSort(vec, 0, vec.size() - 1);
    //quickSort(vec, 0, vec.size() - 1);
    //bubbleSort(vec);
    //int idx = binarySearch(vec, 3.5);
    //cout << "the idx of finding is:" << idx << endl; 
    vector<string>::iterator ite;
    for(ite = vec.begin(); ite < vec.end(); ite++)
        cout << *ite << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值