首先说明,小弟是比较菜鸟的,大学不太上心学习,现在重新学了这两种排序思想,用C#简单实现了。不知道哪些地方做得不对,请高手帮忙看看,不懂的可以学习学习,共同进步!希尔排序:using System;namespace ShellSort
{
/// <summary>
/// Class1 の概要の説明です。
/// </summary>
class ShellSort
{
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main(string[] args)
{
int[] MyArray=new int[19]{5,51,42,64,58,15,24,74,21,13,34,5,33,453,23,425,23,6532,65};
ShellSort ss=new ShellSort();
ss.ShellSortMethod(MyArray);
} public void ShellSortMethod(int[] data)
{
//取得数组长度
int len=data.Length;
System.Console.Write("原始数据为:");
for(int n=0;n<len-1;n++)
{
System.Console.Write(data[n].ToString()+",");
}
System.Console.WriteLine(data[len-1].ToString()); for(int d=len/2;d>0;d/=2)//增量设置,将数据分组。如:(a[0],a[d],a[2*d]……),(a[1],a[d+1],a[2*d+1]……)等
{
for(int m=0;m<d;m++)//对每个分组排序
{
for(int i=m+d;i<len;i+=d)//每个分组的第i个元素,和前面所有元素进行比较
{
int s=data[i];
int j=i-d;
while(j>=0 && s<data[j])
{
data[j+d]=data[j];//符合条件时,将数据后移一个位置
j-=d;
}
data[j+d]=s;//找到正确的位置,插入
}
}
System.Console.Write("增量值为"+d+"时的排序结果:");
for(int k=0;k<len;k++)
{
System.Console.Write(data[k].ToString()+",");
}
System.Console.Out.Write("\n");
}
}
}
}
堆排序:using System;namespace HeapSort
{
/// <summary>
/// Class1 の概要の説明です。
/// </summary>
class HeapSort
{
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main(string[] args)
{
int[] MyArray=new int[9]{42,13,24,91,23,16,5,88,8};
System.Console.Write("原始数据:");
for(int i=0;i<MyArray.Length;i++)
{
System.Console.Write(MyArray[i]+",");
}
System.Console.Write("\n");
HeapSort hs=new HeapSort();
hs.HeapSortMethod(MyArray);
}
private void Heap(int[] data,int k,int p)//构建堆,对第k个元素来说,调整K的所有子节点,使之满足堆定义
{
int len=p; if(2*k<=len)//有左子树
{
if(2*k+1<=len)//有右子树
{
if(data[2*k-1]<=data[2*k])//取出大的子树
{
if(data[k-1]<data[2*k])//与大的子树比较
{
int change=data[2*k];
data[2*k]=data[k-1];
data[k-1]=change; Heap(data,2*k+1,len);//每一次数据交换,都有可能使被交换的数据的子节点不满足堆定,故也需要调整
}
}
else
{
if(data[k-1]<data[2*k-1])
{
int change=data[2*k-1];
data[2*k-1]=data[k-1];
data[k-1]=change; Heap(data,2*k,len);
}
}
}
else//无右子树
{
if(data[k-1]<data[2*k-1])
{
int change=data[2*k-1];
data[2*k-1]=data[k-1];
data[k-1]=change;
}
}
}
}
private void HeapInit(int[] data)//将初始数据构建成堆
{
int len=data.Length;

for(int i=len/2;i>0;i--)//长度为len的数组,len/2后面的数据都是子节点,不需要调整
{
Heap(data,i,len);
}
} private void HeapSortMethod(int[] data)
{
HeapInit(data);//初始化堆
System.Console.Write("初始化堆:");
for(int g=0;g<data.Length;g++)
{
System.Console.Write(data[g]+",");
}
System.Console.Write("\n"); //对于初始化后的堆,首先将根节点与最后一个节点交换,此时最大值移动到数组末尾
//对数组除最后一个数据以外的其他数据再次构建堆,再次交换。重复此过程知道所有数据排序完成
for(int i=0;i<data.Length-1;i++)
{
int min=data.Length-i;
int c=data[0];
data[0]=data[min-1];
data[min-1]=c; Heap(data,1,min-1);//因为交换数据后只有第一个节点数据变化,所以传入参数1,min-1的作用是不让交换后的数据参与构建新堆 System.Console.Write("第"+i+"?排序后?生的堆:");
for(int n=0;n<data.Length;n++)
{
System.Console.Write(data[n]+",");
}
System.Console.Write("\n");
}
}
}
}