花式排序

#include<iostream>
#include<vector>
#include<algorithm>
#include<random>
#include<ctime>
using namespace std;

void bubbleSort(vector<int> &nums){
    // 冒泡排序
    for(int i=0; i<nums.size()-1; ++i)
        for(int j=nums.size()-1; j>i; j--)
            if(nums[j-1] > nums[j])swap(nums[j],nums[j-1]);
}

void bubbleSort1(vector<int> &nums) {
    for(int i=0; i<nums.size()-1; ++i) {
        bool flag = true;
        for(int j=nums.size()-1; j>i; --j)
            if(nums[j-1] > nums[j]) swap(nums[j], nums[j-1]), flag = false;
        if(flag) break;
    }
}

void bubbleSort2(vector<int> &nums) {
    int right = nums.size() - 1;
    for(int i=0; i<nums.size()-1; i++) {
        bool flag = true;
        int tem = right;
        for(int j=0; j<tem; j++)
            if(nums[j] > nums[j+1]) 
                swap(nums[j], nums[j+1]), flag = false, right = j;
        if(flag) break;
    }
}

void bubbleSort3(vector<int> &nums) {
    // 鸡尾酒排序
    for(int i=0; i<nums.size()/2; i++) {
        bool flag = true;
        for(int j=i; j<nums.size()-i-1; j++)
            if(nums[j] > nums[j+1]) 
                swap(nums[j], nums[j+1]), flag = false;
        if(flag) break;
        flag = true;
        for(int j=nums.size()-1; j>i; j--)
            if(nums[j-1] > nums[j])
                swap(nums[j],nums[j-1]), flag = false;
        if(flag) break;
    }
}

void bubbleSort4(vector<int> &nums) {
    int left = 0, right = nums.size()-1;
    // 鸡尾酒排序
    for(int i=0; i<nums.size()/2; i++) {
        bool flag = true;
        int l = left, r = right;
        for(int j=l; j<r; j++)
            if(nums[j] > nums[j+1]) 
                swap(nums[j], nums[j+1]), flag = false, right = j;
        if(flag) break;
        flag = true;
        for(int j=right; j>l; j--)
            if(nums[j-1] > nums[j])
                swap(nums[j],nums[j-1]), flag = false, left = j;
        if(flag) break;
    }
}

void selectSort(vector<int> &nums){
    // 选择排序
    for(int i=0; i<nums.size()-1; ++i){
        int minIndex = i;
        for(int j=i+1; j<nums.size(); ++j)
            if(nums[j] < nums[minIndex])minIndex = j;
        swap(nums[i],nums[minIndex]);
    }
}

void insertSort(vector<int> &nums){
    // 插入排序
    for(int i=1;i<nums.size(); ++i)
        for(int j=i-1; j >=0 && nums[j]>nums[j+1]; --j)
            swap(nums[j], nums[j+1]);
}

void merge(vector<int> &nums, int l, int m, int r){
    vector<int> tem(r-l+1);
    int i = 0, p1 = l, p2 = m+1;

    while(p1 <= m && p2 <= r)
        tem[i++] = nums[p1] >= nums[p2] ? nums[p2++] : nums[p1++];
    while(p1 <= m)
        tem[i++] = nums[p1++];
    while(p2 <= r)
        tem[i++] = nums[p2++];

    while(--i >= 0)
        nums[r--] = tem[i];
}

void mergeSort(vector<int> &nums, int left, int right){
    if(left==right)return ;
    int mid = ((right-left) >> 1) + left;
    mergeSort(nums, left, mid);
    mergeSort(nums, mid+1, right);
    merge(nums, left, mid, right);
}

void mergeSort(vector<int> &nums){
    // 归并排序
    if(nums.size() < 2)return ;
    mergeSort(nums, 0, nums.size()-1);
}

void quickSort(vector<int> &nums, int left, int right){
    if(left >= right)return ;
    // 随机选择基准点, 时间复杂度期望为 N*logN
    int tem = left + rand()%(right-left+1);
    swap(nums[left], nums[tem]);
    int val = nums[left];

    int l = left-1, r = right+1, cur = left+1;
    while(cur < r){
        if(nums[cur] < val)
            swap(nums[++l], nums[cur++]);
        else {
            if(nums[cur] > val)
                swap(nums[--r], nums[cur]);
            else cur++;
        }
    }
    quickSort(nums,left,l);
    quickSort(nums,r,right);
}

void quickSort(vector<int> &nums){
    // 快速排序
    if(nums.size() < 2) return ;
    quickSort(nums, 0, nums.size()-1);
}

void heapInsert(vector<int> &nums, int index){
    while(nums[index] > nums[(index-1)/2]){
        swap(nums[index], nums[(index-1)/2]);
        index = (index-1)/2;
    }
}

void makeHeap(vector<int> &nums){
    // 建立大根堆
    for(int i=0; i < nums.size(); ++i)
        heapInsert(nums,i);
}

void heapChange(vector<int> &nums, int index, int heapSize){
    // 小根堆中,某一个值变大 或者 大根堆中,某一个值变小
    // 目前是大根堆中的调整
    int left = index*2+1;
    while(left < heapSize){
        int largest = (left+1 < heapSize && nums[left+1] > nums[left]) ? left+1 : left;
        largest = nums[index] > nums[largest] ? index : largest;
        if(largest==index) break;
        swap(nums[index], nums[largest]);
        index = largest;
        left = index*2+1;
    }
}

void heapSort(vector<int> &nums){
    // 堆排序
    makeHeap(nums);
    int heapSize = nums.size();
    while(heapSize > 0){
        swap(nums[0], nums[--heapSize]);
        heapChange(nums, 0, heapSize);
    }
}

void bucketSort(vector<int> &nums){
    // 桶排序, 通过计数排序实现
    if(nums.size() < 2)return ;
    // 先寻找最大值和最小值,确定桶的范围,并建立桶
    int minNum = 1e9+1, maxNum = 0, i = 0;
    for(auto it:nums)minNum = min(minNum, it), maxNum = max(maxNum, it);
    vector<int> bucket(maxNum-minNum+1, 0);
    // 把数据放入桶中, 然后再拿出来
    for(auto it:nums)bucket[it-minNum]++;
    for(int j = 0; j<bucket.size(); ++j)
        while(bucket[j]--)nums[i++] = j+minNum;
}

vector<int> generateVector(int range, int length, bool repeat){
    vector<int> arr;
    if(repeat){
        // 随机生成 length 个在 0~range-1 的数,允许重复
        for(int i=0;i<length;++i)
            arr.push_back(rand()%range);
    }else {
        // 随机生成 length 个在 0~length-1 的数,不允许重复
        for(int i=0;i<length;++i)
            arr.push_back(i);
        for(int i=length-1 ;i >= 0;i--){
            int tem = rand()%(i+1);
            swap(arr[i],arr[tem]);
        }
    }

    return arr;
}

int main(){
    srand(int(time(0)));
    // 设置随机生成函数调用的次数  范围  长度
    int times = 50000, range = 50, length = 50;

    for(int i=0; i<times; ++i){
        // 再次随机生成范围和长度
        int ra = rand()%range+5, le = rand()%length+3;
        bool bl = rand()%2 == 1;

        vector<int> nums = generateVector(ra,le,bl);
        vector<int> tem = nums;
        vector<int> right = nums;
        sort(right.begin(), right.end());

        bubbleSort(tem);

        for(int i=0;i<nums.size();++i)
            if(right[i] != tem[i]){
                cout<<"***"<<endl;
                for(auto it:nums)
                    cout<<it<<' ';
                cout<<endl;
                for(auto it:right)
                    cout<<it<<' ';
                cout<<endl;
                for(auto it:tem)
                    cout<<it<<' ';
                cout<<endl;
                break;
            }

        cout<<"Nice!"<<endl;
    }

    return 0;
}


全部评论

相关推荐

10-13 16:58
门头沟学院 Java
点赞 评论 收藏
分享
来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
注意格局:去年超发意向是忘了
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务