簡體   English   中英

這個排序算法是什么?

[英]What is this sorting algorithm?

我碰巧寫了一個簡單的排序算法,但我不確定這個算法叫什么。

#include<stdio.h>
#include<stdlib.h>

void IDontKnowWhatThisIs(int* arr, int size){
    int* minuscount = malloc(size * sizeof(int));   //new location chooser array
    int* valarr = malloc(size * sizeof(int));   //value backup array

    //compare all elements: size^2
    for (int i = 0; i < size; i++){
        valarr[i] = arr[i];
        minuscount[i] = 0;
        for (int j = 0; j < size; j++){
            if (i != j){
                //the one with the least amount(0) is the smallest value
                if (arr[i] - arr[j] > 0){
                    minuscount[i] += 1;
                }
            }
        }
    }

    //O(size)
    for (int i = 0; i < size; i++){
        //place everything back in
        arr[minuscount[i]] = valarr[i];
    }

    free(minuscount);
    free(valarr);
    //total time complexity: O(size^2)
}


int main(){
    int arr[10] = { 50, 2, 13, 33, 62, 11, 30, 66, 1, -101 };

    IDontKnowWhatThisIs(arr, 10);

    for (int i = 0; i < 10; i++) printf("%d ", arr[i]);

    return 0;
}

這是一種簡單的算法,可以將每個元素相互比較並計算它們的新位置。 然后將其復制回原始數組。

我不認為它是那些通用的 n^2 算法之一(選擇、冒泡、插入),但它的概念仍然很簡單,所以我確信這個算法已經存在。

編輯:再想一想,我認為這類似於選擇排序,但未優化,因為它比較更多..

我不知道這個算法的名稱。 這很聰明,但不幸的是,如果要處理數組中可能的重復項,則需要添加一個額外的步驟。

例如,如果數組是: [3;4;4;1;2]那么minuscount將是[2;3;3;0;1]並且兩個4將被放在arr的同一個單元格中,導致最終數組[1;2;3;4;2] ,其中最后的2是原始數組剩余的。

我也不知道名字。 我將其稱為 RankSort,因為它計算每個元素的排名,以便將它們排列到它們的排序位置。

這種類型不是很有吸引力,因為

  • 它需要兩個額外的 arrays,一個用於秩,一個作為置換緩沖區(可以通過就地實現置換來避免緩沖區);

  • 正如其他人所說,可能的相等元素需要特殊處理,即對值和索引進行字典比較。 這是有代價的;

  • 它執行所有 N² 比較。 (通過更新最大元素的等級,這可以減少到 N(N-1)/2。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM