各种排序算法

class Sort{
public:
    void printIt(int const * arr,int const n){
        for (int i = 0; i < n; i++)
        {
            cout<<arr[i]<<"   ";
        }
    }

    void swap(int * arr,int i,int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

    //1.插入排序12:23----12:29,  6min
    void insertionSort(int * arr,int const n){
        for(int i=1;i<n;i++){
            int j=i-1;
            int tmp = arr[i];
            while(j>=0 && arr[j]>tmp)arr[j+1] = arr[j--];
            arr[j+1]=tmp;
        }
    }

    //2.堆排序12:32----12:53,  19min---写错了。 13:03修复正常,10min
    void heapSort(int * arr,int const n){
        vector<int> vec;
        vec.push_back(0);    //只是占位
        for(int i=0;i<n;i++){
            vec.push_back(arr[i]);
        }
        createHeap(vec);
        for(int i=n-1;i>0;i--){
            arr[i] = vec[0];
            vec[0] = vec[i+1];
            vec.pop_back();
            Sort::modifyHeap(vec,0);  //这里又维护了下堆
        }
        arr[0] = vec[0]; //所以是这个
    }

    void createHeap(vector<int> &vec){
        for(int i = vec.size()>>1;i>=0;i--){
            modifyHeap(vec,i);
        }
    }

    void modifyHeap(vector<int> &vec,int i){
        int lchild = i<<1;
        int rchild = lchild+1;
        int n = vec.size();
        int max = i;
        if(lchild<n && vec[max]<vec[lchild])max=lchild;
        if(rchild<n && vec[max]<vec[rchild])max=rchild;
        if(max==i)return;
        else{
            int tmp = vec[i];
            vec[i] = vec[max];
            vec[max] = tmp;
        }
        modifyHeap(vec,max);
    }

    //快速排序13:03---13:13,10min有bug, 1min修正
    void quickSort(int * arr,int from,int to){
        if(from<to){
            int tmp = arr[from];
            int i = from,j=to;
            while(i<j){
                while(i<j && arr[j]>=tmp)j--;
                if(i<j)arr[i]=arr[j];
                while(i<j && arr[i]<=tmp)i++;
                if(i<j)arr[j]=arr[i];
            }
            arr[i]=tmp;
            quickSort(arr,from,i-1);
            quickSort(arr,i+1,to);
        }
    }

    //简单选择排序13:20---13:25,5min
    void simpleSelectionSort(int * arr, int const n){
        for(int i=n-1;i>=0;i--){
            int max = 0;
            for(int j=1;j<=i;j++){
                if(arr[max]<arr[j])max =j;
            }
            swap(arr,max,i);
        }
    }

    //冒泡排序 13:26---13:32,6min 有bug,7min修复
    void bubbleSort(int *arr,int n){
        for(int i=n-1;i>0;i--){
            bool b=true;
            for(int j=0;j<i;j++){
                if(arr[j]>arr[j+1]){
                    swap(arr,j,j+1);
                    b=false;
                }
            }
            if(b)return;
        }
    }

    //归并排序13:40---13:47, 7min有bug, 5min修复
    void mergeSort(int * arr,int from, int mid, int to){
        if(from<to){
            mergeSort(arr,from,(from+mid)>>1,mid);
            mergeSort(arr,mid+1,(mid+1+to)>>1,to);
            int i= from,j= mid+1;
            vector<int> vec;
            while(i<=mid && j<=to){
                if(arr[i]<arr[j])vec.push_back(arr[i++]);
                else vec.push_back(arr[j++]);
            }
            while(i<=mid)vec.push_back(arr[i++]);
            while(j<=to)vec.push_back(arr[j++]);
            for(int k = from,l=0;k<=to;k++,l++)arr[k] = vec[l];
        }
    }

    //计数排序:对于每个元素,找小于x的元素的个数,如果有17个元素小于
    //x,那么x就应该放在18号位置上。如果有17个元素小于等于x,x就可以放在
    //第17个位置上,再减一。其中x∈关键字数组0~k。
    //数组A[1..n]原始数组
    //数组B[1..n]存放排列的输出
    //数组C[1..n]: C[i]存放小于等于,且未输出的i的个数
    void countSort(int * arr1,int *arr2,int const k,int const n){
        vector<int> vec;
        for(int i=0;i<=k;i++)vec.push_back(0);
        for(int i=0;i<n;i++)vec[arr1[i]]++;
        for(int i=1;i<=k;i++)vec[i] += vec[i-1];
        for(int i=n-1;i>=0;i--)arr2[(vec[arr1[i]]--)-1]=arr1[i];
    }

    //希尔排序
    void shellSort(int *arr,int n){
        for(int span = n>>1;span>=1;span >>=1){
            for(int i=0;i<span;i++){
                insertionShellSort(arr,n,span,i);
            }
        }
    }

    void insertionShellSort(int *arr,int n,int span,int from){
        for(int i=from+span;i<n;i += span){
            int tmp = arr[i],j=i-span;
            while(j>=0 && tmp<arr[j]){
                arr[j+span] = arr[j];
                j -= span;
            }
            arr[j+span] = tmp;
        }
    }

};

 

posted on 2016-05-19 19:56  各种笔记  阅读(171)  评论(0编辑  收藏  举报