排序算法

Posted 上衫_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法相关的知识,希望对你有一定的参考价值。

排序算法

说明

目前还没有时间写出算法详解,等以后有时间会补上的

冒泡排序

template <class T>
void bubble_sort(vector<T> &x)//冒泡排序

    inf temp;
    for (inf i = 0; i < x.size();i++)
    
        inf maxnum = x[0];
        inf max_posion = 0;
        for (inf j = 1; j < x.size() - i;j++)
        
            if(x[j]>maxnum)
            
                maxnum = x[j];
                max_posion = j;
            
        
        temp = x[max_posion];
        x[max_posion] = x[x.size() - i - 1];
        x[x.size() - i - 1] = maxnum;

    

直接插入排序

template <class T>
void insertsort(vector<T> A)//直接插入排序

    for (inf i = 1; i < A.size(); i++)
    
        inf temp = A[i];
        inf j = i - 1;
        while (A[j]>temp&&j>=0) 
        
            A[j + 1] = A[j];
            j--;
        
        A[j + 1] = temp;
    
    

希尔排序

template <class T>
void shell_sort(vector<T> A)//希尔排序(二分插入排序)

    inf d=A.size()/2;
    while(d>0) 
    
        for(inf i=d;i<A.size();i++) 
        
           T x=A[i];
           inf j=i-d;
           while(j>=0&&x<A[j] )
           
               A[j+d]=A[j]; 
               j=j-d;
           
           A[j+d]=x;
        
        d=d/2;
      

直接选择排序

template <class T>
void select_sort(vector<T> A)//直接选择排序

    for (inf i = 0; i < A.size(); i++)
    
        T min = A[i];
        inf index = i;
        for (inf j = i + 1; j < A.size(); j++)
        
            if(A[j]<min)
            
                min = A[j];
                index = j;
            
        
        T temp = A[i];
        A[i] = min;
        A[index] = temp;
    
    

快速排序

template <class T>
void quicksort(inf left,inf right,vector<T> &A)//快速排序

    inf i,j,t,temp;
    if(left>right)
        return;
    temp=A[left];
    i=left;
    j=right;
    while(i!=j) 
    
        while(A[j]>=temp&&j>i)
            j--;
        while(A[i]<=temp&&j>i)
            i++;
        if(i<j) 
        
            t=A[i];
            A[i]=A[j];
            A[j]=t;
        
    
    A[left]=A[i];
    A[i]=temp;
 
    quicksort(left,i-1,A);
    quicksort(i+1,right,A);

template <class T>
void quicksort(vector <T> A)

    quicksort(0, A.size() - 1, A);


堆排序

template <class T>
void sift(vector<T> &A,inf begin,inf end)

    inf dad = begin;
    inf son = dad * 2 + 1;
    while (son <= end)
     
        if (son + 1 <= end && A[son] < A[son + 1]) 
            son++;
        if (A[dad] > A[son]) 
            return;
        else 
         
            swap(A[dad], A[son]);
            dad = son;
            son = dad * 2 + 1;
        
    


template <class T>
void heap_sort(vector<T> A,inf n)

    for (inf i = n / 2 - 1; i >= 0; i--)
    
        sift(A, i, n-1);
    
    for (inf i = n-1; i > 0; i--)
    
        swap( A[0],A[i]);
        sift(A, 0, i - 1);
    
    

两路归并排序

template <class T>
void Merge(vector<T> &Array, inf front, inf mid, inf end) 

    vector<T> LeftSubArray(Array.begin() + front, Array.begin() + mid + 1);
    vector<T> RightSubArray(Array.begin() + mid + 1, Array.begin() + end + 1);
    inf idxLeft = 0, idxRight = 0;
    LeftSubArray.insert(LeftSubArray.end(), numeric_limits<inf>::max());
    RightSubArray.insert(RightSubArray.end(), numeric_limits<inf>::max());
    for (inf i = front; i <= end; i++) 
    
        if (LeftSubArray[idxLeft] < RightSubArray[idxRight]) 
        
            Array[i] = LeftSubArray[idxLeft];
            idxLeft++;
         
        else 
        
            Array[i] = RightSubArray[idxRight];
            idxRight++;
        
    


template <class T>
void MergeSort(vector<T> &Array, inf front, inf end) //两路归并排序

    if (front >= end)
        return;
    inf mid = (front + end) / 2;
    MergeSort(Array, front, mid);
    MergeSort(Array, mid + 1, end);
    Merge(Array, front, mid, end);

以上是关于排序算法的主要内容,如果未能解决你的问题,请参考以下文章

排序算法概述

十大经典排序算法总结(归并排序)

十大经典排序算法总结(桶排序)

十大经典排序算法总结(希尔排序)

十大经典排序算法总结(快速排序)

十大经典排序算法总结(冒泡排序)