比較しないソートの作成
Posted feedbacks - C#
horiuchiさんの#6648をコピペしてC#のコードに改変しました。
殆ど一緒です。行数まで一致しています。
JavaとC#って似てますよね。
殆ど一緒です。行数まで一致しています。
JavaとC#って似てますよね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | using System;
public class Sample187 {
public static int[] countingSort(int min, int max, int[] data) {
int[] counter = new int[max - min + 1];
foreach(int i in data) {
counter[i - min]++;
}
int[] result = new int[data.Length];
int index = 0;
for(int i = 0; i < counter.Length; i++) {
for(int count = 0; count < counter[i]; count++) {
result[index++] = i + min;
}
}
return result;
}
public static void Main(String[] args) {
int[] sort = countingSort(-1, 10, new int[] { -1, 9, 4, 8, 9, 6, 3, 9, 5, 2 });
foreach(int i in sort) Console.Write(i + " ");
}
}
|
基数ソートです。 引数の最大値と最小値はメソッド内で使用してません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | using System;
using System.Linq;
class Program
{
static void Main()
{
int[] x = { -1, 9, 4, 8, 9, 6, 3, 9, 5, 2 };
foreach (var item in RadixSort(x, int.MinValue, int.MaxValue))
{
Console.Write(item + " ");
}
Console.WriteLine();
}
static int[] RadixSort(int[] a, int min, int max)
{
for (uint x = 1; x != 0; x <<= 1)
{
a = a.Where(n => (n & x) == 0).Concat(a.Where(n => (n & x) != 0)).ToArray();
}
return a.SkipWhile(n => 0 <= n).Concat(a.TakeWhile(n => 0 <= n)).ToArray();
}
}
|
LINQでぴしっとはまると気持ちいいですね。基数ソートのつもりでしたが、鳩の巣ソートらしいです。Mainは#6652から持ってきました、ありがとうございます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using System;
using System.Linq;
using System.Collections.Generic;
class C
{
static IEnumerable<int> countingSort(int[] src, int min, int max)
{
var l = src.ToLookup(i => i);
return Enumerable.Range(min, max - min + 1).SelectMany(i => l[i]);
//こう書いても同じ
// return from i in Enumerable.Range(min, max - min + 1)
// from e in l[i]
// select e;
}
static void Main()
{
var sort = countingSort(new int[] { -1, 9, 4, 8, 9, 6, 3, 9, 5, 2 }, -1, 9);
foreach (var e in sort)
Console.Write(e + " ");
}
}
|




sweetie089 #6628() Rating3/3=1.00
[ reply ]