排序总结

快速排序

时间复杂度:O(N*logN)
空间复杂度:O(N*logN)
最坏情况:当数组全都排好序时,此时划分区间会出现一个为0,一个为n的情况,此时的时间复杂度是O(N*N)
算法不稳定
void quickSort(int* pArr,int nLIndex,int nRIndex)
{
    if(pArr==NULL||nLIndex>=nRIndex||nLIndex<0)
        return;
    int nL = nLIndex;
    int nR = nRIndex;
    int nFlag = pArr[nL];
    while (nL<nR) {
        while (nL<nR) {
            if (pArr[nR]<nFlag) {
                pArr[nL] = pArr[nR];
                break;
            }
            nR--;
        }
        while (nL<nR) {
            if (pArr[nL]>nFlag) {
                pArr[nR] = pArr[nL];
                break;
            }
            nL++;
        }
    }
    pArr[nL] = nFlag;
    quickSort(pArr, nLIndex, nL-1);
    quickSort(pArr, nL+1, nRIndex);
}



堆排序

时间复杂度:O(N*logN)
空间复杂度:O(1),每次只需要交换一个元素。
最坏情况:也是O(N*logN)。即使排序好了,也只影响建堆,不影响每次排序并swap的时间。因此一直是O(N*logN)。
算法不稳定
void swap(int &nA,int &nB)
{
    int nTmp = nA;
    nA = nB;
    nB = nTmp;
}

void shiftUp(int *pArr, int nNode, int nSize)
{
    if (pArr==NULL&&nSize<=0) {
        return;
    }
    int nLChild = 2*nNode;
    int nRChild = 2*nNode+1;
    int nMax = nNode;
    if (nLChild<nSize&&pArr[nLChild]>pArr[nMax]) {
        nMax = nLChild;
    }
    if (nRChild<nSize&&pArr[nRChild]>pArr[nMax]) {
        nMax = nRChild;
    }
    if (nMax!=nNode) {
        swap(pArr[nNode],pArr[nMax]);
        shiftUp(pArr, nMax, nSize);
    }
    
}

void buildHeap(int *pArr, int nSize)
{
    for (int nIndex = nSize/2; nIndex>=0; nIndex--) {
        shiftUp(pArr, nIndex, nSize);
    }
}



归并排序

时间复杂度:O(N*logN)
空间复杂度:O(n),占用的空间较多。
算法稳定
void merge(int* pArr,int nL,int nM,int nR,int* pTmp)
{
    if (pArr==NULL||pTmp==NULL) {
        return;
    }
    int i=nL;
    int j=nM+1;
    int k=nL;
    while (i<=nM&&j<=nR) {
        if (pArr[i]<pArr[j]) {
            pTmp[k] = pArr[i++];
        }
        else{
            pTmp[k] = pArr[j++];
        }
        k++;
    }
    while (i<=nM) {
        pTmp[k++] = pArr[i++];
    }
    while (j<=nR) {
        pTmp[k++] = pArr[j++];
    }
    for (int nIndex=nL; nIndex<=nR; nIndex++) {
        pArr[nIndex] = pTmp[nIndex];
    }
}
void mergeSort(int* pArr,int nL,int nR,int* pTmp)
{
    if (nL<nR) {
        int nM = (nL+nR)/2;
        mergeSort(pArr,nL,nM,pTmp);
        mergeSort(pArr,nM+1,nR,pTmp);
        merge(pArr,nL,nM,nR,pTmp);
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值