我编写了以下方法,通过将最大值复制到另一个数组来对数组进行排序。我想看看这种方法的替代方案。例如,一种方法,它交换主数组本身的值,从而消除了将值复制到的辅助数组的需要。
我不想使用预先编写的.net库方法,例如Array.sort等,因为我的主要目标只是练习编写算法。
如果有人能告诉我下面代码的弱点及其缺点以及如何改进,我们将不胜感激。
谢谢
private static void sortArray(int[] array)
{
int[] sorted = new int[array.Length];
int curMax = 0;
int bigIndex = 0;
for (int i = 0; i < array.Length; i++)
{
for (int j = 0; j < array.Length; j++)
{
if (array[j] > curMax)
{
bigIndex = j;
curMax = array[j];
}
}
sorted[i] = array[bigIndex];
array[bigIndex] = 0;
curMax = 0;
}
}
冒泡排序示例:
private static void sortArray(int[] array)
{
bool lastExchange;
do
{
lastExchange = false;
for (int i = 1; i < array.Length; i++)
{
if (array[i - 1] > array[i])
{
lastExchange = true;
int temp = array[i - 1];
array[i - 1] = array[i];
array[i] = temp;
}
}
} while (lastExchange);
}
答案 0 :(得分:3)
你的算法是(请原谅我说),就像排序算法一样低效。例如,您可以通过简单地交换数组中的项而不是在数组中保留未使用的值来提高效率。通过这样做,您将减少每次迭代必须查看的项目数量:
private static void sortArray(int[] array) {
for (int i = 0; i < array.Length; i++) {
int largest = array[i];
int largeIndex = i;
for (int j = i + 1; j < array.Length; j++) {
if (array[j] > largest) {
largeIndex = j;
largest = array[j];
}
}
array[largeIndex] = array[i];
array[i] = largest;
}
}
(算法的另一个问题是它不适用于负值或零值。)
最简单的排序算法之一是bubble sort:
private static void sortArray(int[] array) {
bool cont = true;
while (cont) {
cont = false;
for (int i = 1; i < array.Length; i++) {
if (array[i - 1] > array[i]) {
cont = true;
int temp = array[i - 1];
array[i - 1] = array[i];
array[i] = temp;
}
}
}
}
答案 1 :(得分:2)
查看http://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms有关排序算法的示例。您可以点击任意一个,然后根据他们的描述自己实施。
目前您所拥有的是一种选择排序,它很容易实现,但就排序算法而言并不是那么好。一个好的排序算法将具有n(log n)复杂度(通常是log n search * n项)。
答案 2 :(得分:0)
答案 3 :(得分:0)
我喜欢 Bucket Sort ,并且扩展 Radix-Sort 最佳! 有两个原因:
另请查看堆排序,这是一个不错的算法。