排序

常见的排序算法总结。

冒泡排序:

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

简单选择排序:

void selectSort(vector<int>&array){
    for(int i=0;i<array.size()-1;i++){
        int maxVal=array[0];
        int maxIndex=0;
        for(int j=0;j<array.size()-1-i;j++){
            if(array[j]>maxVal){
                maxVal=array[j];
                maxIndex=j;
            }
        }
    swap(array[array.size()-1-i],array[maxIndex]);
    }
}

插入排序:

void insertSort(vector<int>&array){
    for(int i=1;i<=array.size()-1;i++){
        int temp=array[i];
        int j=i-1;
        for(;j>=0 && array[j]>temp;j--)
                array[j+1]=array[j];
        array[j+1]=temp;
    }
}

快速排序:

void quickSort(vector<int>& nums) {
    if(nums.size()==0)
        return ;
    Sort(nums,0,nums.size()-1);
}
void Sort(vector<int> &nums,int numBegin,int numEnd){
    if(numBegin>=numEnd)
        return;
    int temp=nums[numBegin];
    int i=numBegin,j=numEnd;
    While(i<j){
        while(i<j&&nums[j]>=temp)
            j--;
        if(i<j)
            nums[i++]=nums[j];
        while(i<j&&nums[i]<=temp)
            i++;
        if(i<j)
            nums[j--]=nums[i];
    }
    nums[i]=temp;
    Sort(nums,numBegin,i-1);
    Sort(nums,i+1,numEnd);
}

堆排序:

void heapAjust(vector<int>&array,int i,int length){
    for(int j=2*i+1;j<length;j=j*2+1){
        if(j+1<length && array[j]<array[j+1])
            j++;//
        if(array[j]>array[(j-1)/2]){
            swap(array[j],array[(j-1)/2]);
        }
    }
}
void heapSort(vector<int>&array){
    for(int i=array.size()/2-1;i>=0;i--){
        heapAjust(array,i,array.size());
    }
    for(int i=array.size()-1;i>=0;i--){
        swap(array[0],array[i]);
        heapAjust(array,0,i);
    }
}

归并排序:

void merge(vector<int>&array,int left,int mid,int right){
    vector<int>temp(right-left+1);
    int low=left,high=right,middle=mid+1;
    int cur=0;
    while(low<=mid&&middle<=high){
        if(array[low]<=array[middle])
            temp[cur++]=array[low++];
        else 
            temp[cur++]=array[middle++];
    }
    while(low<=mid)
        temp[cur++]=array[low++];
    while(middle<=high)
        temp[cur++]=array[middle++];
    cur=0;
    while(cur<temp.size())
        array[left++]=temp[cur++];
}
void mergeSort(vector<int>&array,int left,int right){
    if(left>=right)
        return ;
    int mid=left+(right-left)/2;
    mergeSort(array,left,mid);
    mergeSort(array,mid+1,right);
    merge(array,left,mid,right);
}

希尔排序:

void shell(vector<int>&array,const int step){
    for(int i=0;i<step;i++){
        for(int j=i+step;j<array.size();j+=step){
            int temp=array[j];
            int k=j-step;
            for(;k>=i&&array[k]>temp;k-=step)
                array[k+step]=array[k];
            array[k+step]=temp;
        }
    }
}
void shellSort(vector<int>&array,const vector<int>&step){
    for(int i=0;i<step.size();i++){
        shell(array,step[i]);
    }
}
原文地址:https://www.cnblogs.com/healthylife/p/5869746.html