[英]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.