本文作者:思念天灵,QQ: 47913857,网站:www.dreamlandcn.com
欢迎来访询问与讨论,本文有错的地方,愿能各位谅解并给予批评指出。
如果引用本文内容请注明出处,谢谢。
排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。(《数据结构(C语言版)》,(清华大学出版社),263页)目前常用的排序算法有很多种,其中包括了容易简单理解的排序算法,和一些时间和空间较小的经典算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。当然,目前因为.net Framework 2.0中有Array类,并且该类中拥有Sort()函数,可以大大简化我们排序的工作。以下例子仅供参考,本人仅仅作了整形数组的排序,其他还可以进行许多类型的排序,如string、bool(boolen)、int(integer)、object等类型的排序。
例:.net Framework中的Array.Sort()函数例子
(VB)
|
Module Module1
''' <summary>
''' 排序,使用Array.Sort()函数,Powered By 思念天灵
''' </summary>
''' <remarks></remarks>
Sub Main()
Dim myArray(0 To 11) As Integer
myArray(0) = 22
myArray(1) = 53
myArray(2) = 72
myArray(3) = 11
myArray(4) = 34
myArray(5) = 44
myArray(6) = 11
myArray(7) = 15
myArray(8) = 28
myArray(9) = 3
myArray(10) = 10
myArray(11) = 65
Array.Sort(myArray)
For Each x As Integer In myArray
Console.Write("{0},", x)
Next
Console.ReadKey()
End Sub
End Module
|
(C#)
|
using System;
using System.Collections.Generic;
using System.Text;
namespace SortClass
{
class Program
{
/// <summary>
/// 排序,使用Array.Sort()函数,Powered By 思念天灵
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
int[] myArray = { 22, 53, 72, 11, 34, 44, 11, 15, 28, 3, 10, 65 };
Array.Sort(myArray);
foreach (int x in myArray)
{
Console.Write("{0},", x);
}
Console.ReadKey();
}
}
}
|
(C++)(需要在.net Framework下才可使用。)
|
#include "stdafx.h"
using namespace System;
//排序,使用Array.Sort()函数,Powered By 思念天灵
int main(array<System::String ^> ^args)
{
array<int>^myArray={ 22, 53, 72, 11, 34, 44, 11, 15, 28, 3, 10, 65 };
Array::Sort(myArray);
for(int i=0;i<12;i++)
{
Console::Write("{0},", myArray[i]);
}
Console::ReadKey();
return 0;
}
|
(J#)
|
package SortClassJSharp;
import System.*;
/**
* 排序,使用Array.Sort()函数,Powered By 思念天灵
*/
public class Program
{
public static void main(String[] args)
{
int myArray[] = new int[] { 22, 53, 72, 11, 34, 44, 11, 15, 28, 3, 10, 65 };
Array.Sort(myArray);
for (int i = 0; i < 12; i++)
{
Console.Write(myArray[i] + ",");
}
Console.ReadKey();
}
}
|
运行结果均相同,如图表1所示:

图表 1
JavaScript中也有相同的sort()函数,但因JavaScript只能用于网页上,故不在此讨论。
微软MSDN上对System.Array.Sort的说明:“Array中的每个元素均必须实现 IComparable接口,才能与array 中的其他所有元素进行比较。如果排序不能成功地完成,则结果未定义。此方法使用QuickSort算法。此实现执行不稳定排序;亦即,如果两元素相等,则其顺序可能不被保留。相反,稳定排序保留相等元素的顺序。一般情况下,此方法的运算复杂度为O(n log n),其中n是array的Length;最坏的情况下其运算复杂度为O(n 2)。”
结论:Array.Sort其内部使用了大数据量时效率最高的快速排序算法。C#实现的快速排序没有C++的快这一点原因很明显。Array.Sort效率是很高的,没有必要怀疑它,建议使用它。如排序自己的类:Array.Sort< Customer> ( customer, new CustomerComparer () ); //CustomerComparer 实现IComparer接口。(摘自论坛:ITPUB论坛)
虽然,我们能够使用微软所提供的System.Array.Sort方法进行快速排序,但我们还需要对其他的排序方法进行了解,虽然这些排序方法可能没有微软提供的快速排序的效率高,但微软因注重这个类的兼容实用性,这样的接口算法效率高却因接口之间的类型转换和数据判断而损失了优秀算法的效率带来的优秀时效,有时候也可能因为空间可用性以及对大多数已排好顺序的序列进行排序,我们有必要了解其他一些排序方法。另外,排序方法虽然很多,但是其全面性能而言,很难提出一种被认为是最好的方法,每一种方法都有各自的优缺点,适合在不同的环境(如记录的初始排列状态等)下使用。
下面,我将针对如下算法进行各算法和思想的简介以及程序示例。
冒泡排序、交换排序、选择排序(简单选择排序、树形选择排序、堆排序)、插入排序(直接插入排序、希尔排序)、快速排序、归并排序、双向冒泡排序。