接着更。。。。。。。。。。。。
第三章——基础排序算法
对计算机中所存储的数据进行的最普遍的两种操作就是排序和查找。
(1)排序算法
1、数组类测试环境
先构造一个类来封装数组处理的一些常规操作,既元素插入操作(Insert),元素存取访问操作(CArray),以及显示数组内容操作(DisplayElements)。
using System;
class CArray
{
private int[] arr;
private int upper;
private int numElements;
public CArray(int size)
{
arr = new int[size];
upper = size -1;
numElements = 0;
}
public void Insert(int item)
{
arr[numElements] = item;
numElements++;
}
public void DisplayElements()
{
for(i=0;i<=upper;i++)
Console.Write(arr[i]+"")
}
public void Clear()
{
for(int i=0; i<=upper;i++)
arr[i]=0;
numElements = 0;
}
public void Main()
{
CArray nums = new CArray(50);
for(int i = 0; i<=49;i++)
num[i].Insert(i);
nums.DisplayElement();
Console.ReadKey();
}
}
这样输出出来的结果是0~49,如果用Random的话是可以产生随机数的。
下面看用CArray类来存储的程序,采用的是随机数生成器(Random)来选择存储到数组内的数据:
static void Main()
{
CArray nums = new CArray(10);
Random rnd = new Random(100);
for(int i = 0;i<10;i++)
nums.Insert(rnd.Next(0,100));
nums.DisplayElements();
}
(2)冒泡排序
冒泡排序是可用的最慢的排序算法之一,它也是最容易理解和实现的一种排序算法。实现原理是:多次遍历整个列,并且比较相邻的数值,如果左侧数值大于右侧数值就进行交换。
下面我们将冒泡排序算法命名为BubbleSort来对他进行实现:
public void BubbleSort()
{
int temp;
for(int outer = upper;outer>=1;outer--)
{
for(int inner = 0;inner<=outer-1;inner++)
{
if((int)arr[inner]>arr[inner+1])
{
temp = arr[inner];
arr[inner]=arr[inner+1];
arr[inner+1]=temp;
}
}
this.DisplayElement();
}
}
有几个问题需要注意一下。首先,交换数组元素的代码是写在主程序的代码中,而没有用子程序。如果多次调用交换子程序,就可能会降低排序的速度。
(3)选择排序
这种排序是从数组起始处开始,把第一个元素与数组中其他元素进行比较,然后,将最小的元素放置在第0个位置上,我们命名这个实现选择排序方法为SelectionSort:
public void SelectionSort()
{
int min,temp;
for(int outer=0;outer <=upper;outer++)
{
min = outer;
for(int inner = outer+1;inner<=upper;inner++)
{if(arr[inner]<arr[min])min=inner;}
temp = arr[outer];
arr[outer] = arr[min];
arr[min] = temp;
this.DisplayElements();
}
}
(4)插入排序
插入排序算法类似于人们通常按照数字顺序或者字母顺序进行排序的而方法,我们将它命名为InertionSort
public void InsertionSort()
{
int inner,temp;
for(int outer = 1;outer<=upper;outer++)
{
temp = arr[outer];
inner = outer;
while(inner>0&&arr[inner-1]>=temp)
{
arr[inner] = arr[inner-1];
inner -= 1;
}
arr[inner] = temp;
this.DisplayElements();
}
}
插入排序有两层循环。外层循环会逐个遍历数组元素,而内层循环则会把外层循环所选择的元素与该元素在数组内的下一个元素进行比较。如果外层循环选择的元素小于内层循环选择的元素,那么数组元素都向右移即便内层循环元素留出位置。