zoukankan      html  css  js  c++  java
  • 排序算法总结

    O(n2)的冒泡,选择,插入,先不贴,先贴归并,快排,堆排,

    O(nlog(n))

    归并排序

    二路归并递归写法:时间O(nlog(n)),稳定,总时间O(nlog),空间:O(n+log(n)),n为内存,log(n)为栈空间

    #include<bits/stdc++.h>
    using namespace std;
    
    //归并过程
    void merge(int arr[], int l, int mid, int r){
        int len=r-l+1;//合并长度
        vector<int> help; //临时数组
        int lindex = l;
        int rindex = mid+1;
        while(lindex<=mid && rindex<=r){
            if(arr[lindex]<arr[rindex]){
                help.push_back(arr[lindex++]);
            }else{
                help.push_back(arr[rindex++]);
            }
        }
        while(lindex<=mid){
            help.push_back(arr[lindex++]);
        }
        while(rindex<=r){
            help.push_back(arr[rindex++]);
        }
        for(int i=0;i<len;i++){
            arr[l+i]=help[i];
        }
    }
    
    void mergesort(int arr[], int l,int r){
        if(l==r) return;
        int mid=(r+l)/2;
        mergesort(arr,l,mid);
        mergesort(arr,mid+1,r);
        merge(arr,l,mid,r);
    }
    
    int main(){
        int n;
        while(cin >> n){
            int arr[n];
            for(int i = 0; i < n; i++) cin>>arr[i];
            mergesort(arr, 0,n-1);//排序数组,和起始终止de下标
    
            for(int i = 0; i < n; i++){
                cout << arr[i] << " ";
            }
            cout << endl;
        }
        return 0;
    }
    /*
    10
    8 6 7 9 2 3 4 1 0 5
    */

     非递归和多路归并再说:

    堆排序:对数组进行下标从1开始的堆排序,不稳定,O(nlogn)时间,O(1)空间

    #include<bits/stdc++.h>
    using namespace std;
    
    void heapadjust(int arr[],int index,int len){
        int temp=arr[index];
        for(int i=2*index;i<=len;i*=2){
            if(i<len && arr[i]<arr[i+1])
                i++;
            if(temp>arr[i])
                break;
            arr[index]=arr[i];
            index=i;
        }
        arr[index]=temp;
    }
    void heapsort(int arr[],int len){
        //从最后一个非叶节点建立堆,从下标为1处开始排序
        for(int i=len/2;i>=1;i--){
            heapadjust(arr,i,len);
        }
        for(int i=len;i>1;i--){
            swap(arr[1],arr[i]);
            heapadjust(arr,1,i-1);
        }
    }
    
    int main(){
        int n;
        while(cin >> n){
            int arr[n];vector<int> nums;arr[0]=0;
            for(int i = 1; i <= n; i++) {cin>>arr[i];nums.push_back(arr[i]);}
            heapsort(arr,n);
    
            for(int i = 1; i <= n; i++){
                cout << arr[i] << " ";
            }
            cout << endl;
        }
        return 0;
    }
    /*
    10
    8 6 7 9 2 3 4 1 0 5
    */

    快速排序

    递归实现:不稳定,最坏O(n2),空间复杂度(由递归深度决定,O(n)~O(logn))

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int partitions(int arr[],int low,int high){
        int pivotkey=arr[low];
        while(low<high){
            while(low<high && arr[high]>=pivotkey)
                high--;
            arr[low]=arr[high];
            while(low<high && arr[low]<=pivotkey)
                low++;
            arr[high]=arr[low];
        }
        arr[low]=pivotkey;
        return low;
    }
    
    void quicksort(int arr[],int low,int high){
        if(low<high){
            int pivot=partitions(arr,low,high);
            quicksort(arr,low,pivot-1);
            quicksort(arr,pivot+1,high);
        }
    }
    
    int main(){
        int n;
        while(cin>>n){
            int arr[n];
            for(int i=0;i<n;i++) cin>>arr[i];
            quicksort(arr,0,n-1);
            for(int i=0;i<n;i++) cout<<arr[i]<<" ";
            cout<<endl;
        }
    }
    /*
    10
    8 6 7 9 2 3 4 1 0 5
    */
  • 相关阅读:
    selenium从入门到应用
    Maven 小技巧之 自动更新你的jar包
    selenium从入门到应用
    selenium从入门到应用
    沈逸老师PHP魔鬼特训笔记(8)
    PHP实现遍历、复制、删除目录
    沈逸老师PHP魔鬼特训笔记(7)--我叫什么名字
    PHP常用文件函数和目录函数整理
    沈逸老师PHP魔鬼特训笔记(6)--巫术与骨架
    沈逸老师PHP魔鬼特训笔记(5)
  • 原文地址:https://www.cnblogs.com/joelwang/p/10656498.html
Copyright © 2011-2022 走看看