排序方法

 

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <list>
#include <algorithm>
#include <set>
#include <stack>
using namespace std;


//冒泡排序
template <typename T> void bubbleSort(T arr[], int low, int high)
{
    for (int i = low; i < high; i++) {
        for (int j = low; j < high - i; j++) {
            if (arr[j] > arr[j + 1])
                swap(arr[j], arr[j + 1]);
        }
    }
}

//快速排序
template <typename T> void quickSort(T arr[], int low, int high)
{
    if (high <= low) return;
    int i = low;
    int j = high + 1;
    while (true) {
        //从左向右找比key大的值
        while (i < high && arr[++i] < arr[low]);
        //从右向左找比key小的值
        while (j > low && arr[--j] > arr[low]);
        //到了中间值,退出
        if (i >= j) break;
        //交换i,j对应的值
        swap(arr[i], arr[j]);
    }
    //中枢值与j对应值交换
    swap(arr[low], arr[j]);
    QuickSort(arr, low, j - 1);
    QuickSort(arr, j + 1, high);
}

//插入排序
template <typename T> void insertSort(T arr[], int low, int high)
{
    T tmp;
    int i;
    int j;
    for (i = low; i <= high; i++) {
        tmp = arr[i];//待排序元素
        //j为有序序列的最后一个元素,即待排序元素的前一个元素
        //待排元素小于有序序列的最后一个元素时,向前插入
        for (j = i - 1; j >= 0 && arr[j] > tmp;j--) {
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = tmp;
    }
}

//希尔排序
template <typename T> void shellSort(T arr[], int low, int high){
    //vector<int> result = list;
    //int n = result.size();
    int j;
    for (int gap = high + 1 >> 1; gap > 0; gap >>= 1){
        for (int i = low + gap; i < high + 1; i++){
            int tmp = arr[i];
            for (j = i - gap; j >= low && arr[j] > tmp; j -= gap) {
                arr[j + gap] = arr[j];
            }
            arr[j + gap] = tmp;
        }
    }
}

//归并排序
//https://blog.youkuaiyun.com/m0_38068229/article/details/81262282
template <typename T> void merge(T arr[], int l, int mid, int r) {
    T *tmp = new T[r - l + 1];//辅助数组
    int i = 0;
    int lIndex = l;
    int rIndex = mid + 1;
    while (lIndex <= mid && rIndex <= r) {
        tmp[i++] = arr[lIndex] < arr[rIndex] ? arr[lIndex++]:arr[rIndex++];
    }
    //左边和右边肯定有一边到头了,不可能同时,因为每次只移动一边
    while (lIndex <= mid) {
        tmp[i++] = arr[lIndex++];
    }
    while (rIndex <= r) {
        tmp[i++] = arr[rIndex++];
    }
    //将排好序的辅助数组赋值给原始数组,不需要返回值
    for (i = 0; i < r - l + 1; i++) {
        arr[l+i] = tmp[i];
    }
    free(tmp);
    tmp = nullptr;
}

//递归
template <typename T> void mergeSort(T arr[], int l, int r) {
    if (l >= r) {
        return;
    }
    int mid = (l + r) >> 1;
    //左半部分归并排序
    mergeSort(arr, l, mid);
    //右半部分归并排序
    mergeSort(arr, mid + 1, r);
    //左右部分归并
    merge(arr, l, mid, r);

}

int main()
{
    //int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
    //double a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
    //double a[] = {3,4,1,2,5};
    double a[] = {20, 6, 12, 7, 10};

//QuickSort(a, 0, sizeof(a) / sizeof(a[0]) - 1);//这里原文第三个参数要减1否则内存越界
//BubbleSort(a, 0, sizeof(a) / sizeof(a[0]) - 1);//这里原文第三个参数要减1否则内存越界
//InsertSort(a, 0, sizeof(a) / sizeof(a[0]) - 1);//这里原文第三个参数要减1否则内存越界
//ShellSort(a, 0, sizeof(a) / sizeof(a[0]) - 1);//这里原文第三个参数要减1否则内存越界
mergeSort(a, 0, sizeof(a) / sizeof(a[0]) - 1);//这里原文第三个参数要减1否则内存越界

for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
    cout << a[i] << " ";
}

return 0;

}

 

 

有序数据结构的初始化


#include<set>

//自定义set的key
typedef struct OlympicKey
{
    uint64_t gold;
    uint64_t silver;
    uint64_t bronze;
    string nation;

    //*
    //方法一
    bool operator>(const OlympicKey &k2) const {
        //大顶堆
        cout <<__LINE__<<endl;
        if(gold > k2.gold) return true;
        if(gold < k2.gold) return false;
        return true;
    }

    bool operator<(const OlympicKey &k2) const {
        //小顶堆
        cout <<__LINE__<<endl;
        if(gold < k2.gold) return true;
        if(gold > k2.gold) return false;
        return true;
    }
     //*/

    /*
    //方法一点五
    friend bool operator>(const OlympicKey &k1, const OlympicKey &k2) {
        //大顶堆
        cout <<__LINE__<<endl;
        if(k1.gold > k2.gold) return true;
        if(k1.gold < k2.gold) return false;
        return true;
    }

    friend bool operator<(const OlympicKey &k1, const OlympicKey &k2) {
        //小顶堆
        cout <<__LINE__<<endl;
        if(k1.gold < k2.gold) return true;
        if(k1.gold > k2.gold) return false;
        return true;
    }
     //*/

} OlympicKey;


/*
//方法二
bool operator>(const OlympicKey &k1, const OlympicKey &k2) {
    //大顶堆
    cout <<__LINE__<<endl;
    if(k1.gold > k2.gold) return true;
    if(k1.gold < k2.gold) return false;
    return true;
}

bool operator<(const OlympicKey &k1, const OlympicKey &k2) {
    //小顶堆
    cout <<__LINE__<<endl;
    if(k1.gold < k2.gold) return true;
    if(k1.gold > k2.gold) return false;
    return true;
}
 //*/


int main()
{

    //方法一//方法二
    set<OlympicKey, greater<OlympicKey> > OlympicSet;
    //set<OlympicKey, greater<OlympicKey> > OlympicSet;


    //方法三
    /*
    struct cmp_key
    {
        bool operator()(const OlympicKey &k1, const OlympicKey &k2) const
        {
            if(k1.gold > k2.gold) return true;
            if(k1.gold < k2.gold) return false;
            return true;
        };
    };
    set<OlympicKey, cmp_key> OlympicSet;
    //*/

    /*
    //第四种方法,尚未调通
    auto cmp = [&](const OlympicKey k1, const OlympicKey k2) -> bool{
        //大顶堆
        //cout <<__LINE__<<endl;
        if(k1.gold > k2.gold) return true;
        if(k1.gold < k2.gold) return false;
        return true;
    };

    set<OlympicKey, decltype(cmp) > OlympicSet;
     //*/


    int num = 2;

    OlympicKey key;
    key.gold = 33;
    key.silver = 28;
    key.bronze = 34;
    key.nation = "China";
    OlympicSet.insert(key);

    OlympicKey key2;
    key2.gold = 32;
    key2.silver = 28;
    key2.bronze = 34;
    key2.nation = "Russia";
    OlympicSet.insert(key2);

    // please define the C++ output here. For example:cout<<____<<endl;
    for (auto &it: OlympicSet) {
        cout << it.nation << endl;
    }
    return 0;
}

https://blog.youkuaiyun.com/qq_32541007/article/details/71057282

https://www.cnblogs.com/lengbingshy/p/3491192.html

 

数组排序

https://blog.youkuaiyun.com/hust_bochu_xuchao/article/details/78950370

https://blog.youkuaiyun.com/m0_37433111/article/details/108524173

 

 

使用sort函数进行排序

struct building
{
    int left;
    int right;
    int height;
};

//升序
bool asc (building &b1, building &b2) {
    if (b1.left < b2.left) return true;
    if (b1.left > b2.left) return false;
    if (b1.height > b2.height) return true;
    if (b1.height < b2.height) return false;
    if (b1.right < b2.right) return true;
    if (b1.right > b2.right) return false;
    return false;
}

//sort(bb.begin(), bb.end(), asc);

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值