读书笔记第二篇:c#中常见的排序法
时间:2011-01-12 来源:子路
int j,temp;
j= 1;
while((j<list.Length))
{
for(int i=0;i<list.Length -j;i++)
{
if(list[i]<list[i+1])
{
temp = list[i]; \\大的数向上,小的向下,依次排
list[i] = list[i+1];
list[i+1] = temp;
}
}
j++;
}
二:选择排序法( 该排序法就是拿后面的数跟自己选择的比大小,既可以选从大到小排列,也可以从小到大,灵活性很大)
基本思想:对待排序的记录序列进行n-1遍的处理,第1遍处理是将L[0..n-1]中最小者与L[0]交换位置,第2遍处理是将L[1..n]中最小者与L[1]交换 位置,......,第i遍处理是将L中最小者与L交换位置。这样,经过i遍处理之后,前i个记录的位置就已经按从小到大的顺序排列好了。
public void SortChoice(int [] list)
{
int min;
for(int i=0;i<list.Length-1;i++) \\遍历这个表
{
min=i; \\从小到大排列
\\max=i ; 从大到小
for(int j=i+1;j<list.Length;j++) \\小的向上,大的向下
{
if(list[j]<list[min])
min=j;
\\if(list[j]>list[min]) max=j; \\小的向下,大的向上
}
int t=list[min];
list[min]=list[i];
list[i]=t;
}
}
三:插入排序法(插入的是i值,比较的起点不是list[0])
public void SortInsert(int [] list)
{
for(int i=1;i<list.Length;i++)
{
int t=list[i];
int j=i;
while((j>0)&&(list[j-1]<t)) \\大的向上,小的向下
{
list[j]=list[j-1];
--j;
}
list[j]=t;
}
}
四:希尔排序(Shell Sort)是插入排序的一种优化。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
对希尔排序的理解:比如对于数组{9,38,36,65,13,76,27,49,4,11}
希尔排序一种分组插入排序。但就其实质就是逐步合并的过程。
先把序列分成5组,并组内排序:{9,38},{36,65},{13,76},{27,49},{4,11}
再将组分成3大组:{9,36,38,65},{13,27,49,76},{4,11}
然后分成2大组:{9,13,27,36,38,49,65,76},{4,11}
最后:{4,9,11,13,27,36,38,49,65,76}
每次合并都是最多O(n)的算法,合并的次数最多O(logn),因此希尔排序理论上是O(nlogn)的算法,
但由于需要大量的数组赋值,速度并不快。
public void SortShell(int [] list)
{
int inc;
for(inc=1;inc<=list.Length/9;inc=3*inc+1); \\增量的初值定义,以及循环方式
for(;inc>0;inc/=3) \\下一个增量
{
for(int i=inc+1;i<=list.Length;i+=inc)
{
int t=list[i-1];
int j=i;
while((j>inc)&&(list[j-inc-1]>t))
{
list[j-1]=list[j-inc-1]; \\插入到正确的位置
j-=inc; \\后移
}
list[j-1]=t;
}
}
}
先就写下这四种算法,个人目前新手,比较喜欢用冒泡和选择排序(囧)
实例: (待编辑)