基本的排序算法

排序算法

  • 插入排序
  • 归并排序
  • 快排
  • 随机快排
  • 计数排序
  • 冒泡排序
  • 堆排序

Sort.h

#ifndef SORT_H_
#define SORT_H_

#include<vector>
#include<cstdlib>
#include<climits>
using namespace std;
class Sort {
public:
    Sort();
    //插入排序
    void InsertSort(vector<int> &A);
    //归并排序
    void MergeSort(vector<int> & A,int p,int r);
    void Merge(vector<int> &A,int p,int q,int r);

    //快排
    void QucikSort(vector<int> &A,int q,int r);
    //随机快排
    void RandomQucikSort(vector<int> &A,int q,int r);
    //计数排序
    void CountSort(vector<int> &A,vector<int> &B,int k);
    //冒泡排序
    void BubbleSort(vector<int> & A);

    //堆排序(最大堆)
    int Parent(int i);
    int Left(int i);
    int Right(int i);
    void MaxHeapify(vector<int> &A,int i,int size);//维护堆
    void BuildMaxHeap(vector<int> &A);//建堆
    void HeapSort(vector<int> &A);//堆排序

    virtual ~Sort();
};

#endif /* SORT_H_ */

Sort.cpp

#include "Sort.h"

Sort::Sort() {
    // TODO Auto-generated constructor stub

}

Sort::~Sort() {
    // TODO Auto-generated destructor stub
}

void Sort::InsertSort(vector<int> &A){
    for(unsigned int i = 1;i < A.size();i++){
        int key = A[i];
        int j = i -1;
        while(j >= 0 && A[j] > key){
            A[j+1] = A[j];
            j--;
        }
        A[j+1] = key;
    }
}


void Sort::MergeSort(vector<int> & A,int p,int r){
    if(p < r){
        int q = (p + r)/2;
        MergeSort(A,p,q);
        MergeSort(A,q+1,r);
        Merge(A,p,q,r);
    }
}
void Sort::Merge(vector<int> &A,int p,int q,int r){
    vector<int> L(&A[p],&A[q+1]);
    vector<int> R(&A[q+1],&A[r+1]);
    L.push_back(INT_MAX);
    R.push_back(INT_MAX);

    int i = 0;
    int j = 0;
    for(int k = p;k <= r;k++){
        if(L[i] <= R[j]){
            A[k] = L[i];
            i++;
        }else{
            A[k] = R[j];
            j++;
        }
    }
}

void Sort::QucikSort(vector<int> &A,int q,int r){
    if(q < r){
        int x = A[r];//选取主元
        int p = q - 1;//记录主元位置(主元素最后所在位置的前一个)
        for(int i = q;i < r;i++){
            if(A[i] < x){
                p++;
                swap(A[p],A[i]);
            }
        }
        swap(A[++p],A[r]);

        QucikSort(A,q,p-1);
        QucikSort(A,p+1,r);
    }
}

void Sort::RandomQucikSort(vector<int> &A,int q,int r){
    if(q < r){

        swap(A[rand()%(r - q + 1)+q],A[r]);//随机产生
        int x = A[r];//选取主元
        int p = q - 1;//记录主元位置(主元素最后所在位置的前一个)
        for(int i = q;i < r;i++){
            if(A[i] < x){
                p++;
                swap(A[p],A[i]);
            }
        }

        swap(A[++p],A[r]);

        RandomQucikSort(A,q,p-1);
        RandomQucikSort(A,p+1,r);
    }
}


void Sort::CountSort(vector<int> &A,vector<int> &B,int k){
    vector<int> C(k+1,0);//存储数组A中比数A[i]小的个数(只用下标1-k的位置)
    for(unsigned int i = 0;i < A.size();i++)
        C[A[i]]++;
    for(int i = 1;i < k+1;i++)
        C[i] += C[i-1];
    B.resize(A.size(),0);
    for(unsigned int i = 0;i < A.size();i++){
        B[C[A[i]] - 1] = A[i];
        C[A[i]]--;
    }
}


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

int Sort::Parent(int i){
    //数组中下标从0开始,堆中下标从1开始
    return (i+1)/2 - 1;
}
int Sort::Left(int i){
    return 2*(i+1) - 1;
}
int Sort::Right(int i){
    return 2*(i+1);
}

void Sort::MaxHeapify(vector<int> &A,int i,int size){
    int l = Left(i);
    int r = Right(i);
    int largest;
    if(l < size && A[l] > A[i])
        largest = l;
    else
        largest = i;
    if(r < size && A[r] > A[largest])
        largest = r;
    if(largest != i){
        swap(A[i],A[largest]);
        MaxHeapify(A,largest,size);
    }
    return;
}

void Sort::BuildMaxHeap(vector<int> &A){
    for(int i = (A.size()/2 - 1) ;i>= 0;i--)
        MaxHeapify(A,i,(int)A.size());
    return;
}

void Sort::HeapSort(vector<int> &A){
    int size = A.size();//用于标记当前堆大小
    BuildMaxHeap(A);
    for(int i = A.size() - 1;i > 0;i--){
        swap(A[i],A[0]);
        size--;
        MaxHeapify(A,0,size);
    }
    return;
}

test.cpp

#include<iostream>
#include<vector>
//#include"Sort.h"
using namespace std;
void PrintVec(vector<int> _A);

int main(){
    /*测试sort类方法*/
    Sort s;
    vector<int> A={2,8,7,9,3,5,2,4,4};
    PrintVec(A);
    s.HeapSort(A);
    s.BubbleSort(A);
    s.MergeSort(A,0,8);
    s.InsertSort(A);
    s.QucikSort(A,0,7);
    s.RandomQucikSort(A,0,7);
    vector<int> B;
    s.CountSort(A,B,8);
    PrintVec(B);
    PrintVec(A);
    return 0;
}
void PrintVec(vector<int> _A){
    for(unsigned int i = 0;i < _A.size();i++){
        cout << _A[i] << ", ";
    }
    cout << endl;
}

其他具体的见github

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值