計數排序 C++,指針,函數調用版本

首先我們需要從我們的標題要求看起,計數排序的意思是計數排序是一個非基於比較的排序算法,它的優勢在於在對一定範圍內的整數排序時,它的複雜度爲Ο(n+k)(其中k是整數的範圍),快於任何比較排序算法。

排序思路:

  1. 掃描整個集合,並設置一個臨時數組,用來存放集合中的數據作爲此數組的集合
  2. 臨時數組設置空間爲集合中最大數+1

我們在來思考一個問題,就是說,我們現在使用的是函數調用版本,那麼就代表着我要要把排序好之後的數組傳回main函數中去。所以使用到了最頭疼的指針。再者,就是函數被調用完成之後,系統爲函數開闢的臨時空間將會被銷燬,那麼我們就只能定義一個全局變量或者在原來的集合基礎上更改他們的值。假如我們定義一個全局變量的數組,那麼我們只能定義一個訂定長數組,顯然特別不方便。所以我們將會採用後者——在原來的集合基礎上更改他們的值。

就產生了以下的代碼:

#include <iostream>
using namespace std;

int *sum(int a[],int i){

    int max=a[0];
    for(int j=0;j<i;j++){
        if(a[j]>max){
            max = a[j];//尋找最大值
        }
    }

    int s[max+1];
    for(int j=0;j<max+1;j++){
        s[j] = 0;//給數組初始值
    }

    for(int j=0;j<i;j++){
        s[a[j]] ++;
    }


    int index=0;
    int num[i];
    for(int j=0;j<i;j++){
        num[j] = 0;//給數組初始值
    }

    for(int j=0;j<max+1;j++){
        for(int k=0;k<s[j];k++){
            a[index++] = j;
        }
    }
    return a;
}


int main() {
    int a[]={1,2,2,6,2,3,8,3};
    int *t=sum(a,sizeof(a)/ sizeof(a[0]));//sizeof(a)/ sizeof(a[0])計算數組的長度
    for(int i=0;i<8;i++){
        cout<<t[i]<<" ";
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章