ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

备考研究生之几种排序

2021-11-01 14:33:56  阅读:197  来源: 互联网

标签:研究生 right int void vector 备考 largest 排序 left


排序

冒泡排序

void BubbleSort(vector<int>& a){
    int n = a.size();
    for (int i = 0; i < n; ++i) {
        for (int j = n-1; j > i; --j) {
            if (a[j] < a[j-1])
                swap(a[j],a[j-1]);
        }
    }
}

选择排序

void SelectionSort(vector<int>& a){
    int n = a.size();
    for (int i = 0; i < n; ++i) {
        int min = a[i];
        int minindex = i;
        for (int j = i+1; j < n; ++j) {
            if (a[j] < min){
                min = a[j];
                minindex = j;
            }
        }
        swap(a[i],a[minindex]);
    }
}

插入排序

void InsertionSort(vector<int>& a){
    int n = a.size();
    for (int i = 1; i < n; ++i) {
        int now = a[i];
        int j = i - 1;
        while(j >= 0 && a[j] > now){
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = now;
    }
}

希尔排序

void ShellSort(vector<int>& a){
    int n = a.size();
    for (int gap = n / 2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; ++i) {
            int j = i;
            int current = a[i];
            while(j - gap >= 0 && current < a[j - gap]){
                a[j] = a[j - gap];
                j -= gap;
            }
            a[j] = current;
        }
    }
}

归并排序

void MergeSort(vector<int>& a,int left,int right){
    if (left < right){
        int mid = (left + right) / 2;
        MergeSort1(a,left,mid);
        MergeSort1(a,mid+1,right);
        Merge1(a,left,mid,right);
    }
}

void Merge(vector<int>& a,int left,int mid,int right){
    vector<int> temp;
    int l = left,r = mid + 1;
    while (l <= mid && r <= right){
        if (a[l] < a[r]){
            temp.push_back(a[l]);
            l++;
        }
        else{
            temp.push_back(a[r]);
            r++;
        }
    }
    while (l <= mid)
        temp.push_back(a[l++]);
    while (r <= right)
        temp.push_back(a[r++]);
    int i = 0,j = left;
    while (j <= right)
        a[j++] = temp[i++];
}

快速排序

void QuickSort(vector<int>& a,int left,int right){
    if (left<right){
        int mid = Partition(a,left,right);
        QuickSort(a,left,mid-1);
        QuickSort(a,mid+1,right);
    }
}

int Partition(vector<int>& a,int left,int right){
    int current = a[right];
    int i = left,j = right;
    while(i < j){
        while (i < j && a[i] < current)
            i++;
        a[j] = a[i];
        while (i < j &&a[j] > current)
            j--;
        a[i] = a[j];
    }
    a[i] = current;
    return i;
}

堆排序

(升序用大根堆,降序用小根堆)

void HeapSort(vector<int>& a){
    BuildMaxHeap(a);

    int n = a.size();
    for (int j = 0; j < n; ++j) {
        cout<<a[j]<<" ";
    }
    cout<<endl;

    int k = n;
    for (int i = n - 1; i > 0; --i) {
        swap(a[i],a[0]);
        k--;
        heapify(a,0,k);
    }
}

void BuildMaxHeap(vector<int>& a){
    int n = a.size();
    for (int i = n / 2; i >= 0 ; --i) {
        heapify(a,i,n);
    }
}

void heapify(vector<int>& a,int i,int n){
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    int largest = i;
    if (left < n && a[left] > a[largest]){
        largest = left;
    }
    if (right < n && a[right] > a[largest]){
        largest = right;
    }
    if (largest != i){
        swap(a[i],a[largest]);
        heapify(a,largest,n);
    }
}

标签:研究生,right,int,void,vector,备考,largest,排序,left
来源: https://blog.csdn.net/qq_41143484/article/details/121079506

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有