c#排序算法

上传人:缘*** 文档编号:333288868 上传时间:2022-09-01 格式:PDF 页数:48 大小:4.54MB
返回 下载 相关 举报
c#排序算法_第1页
第1页 / 共48页
c#排序算法_第2页
第2页 / 共48页
c#排序算法_第3页
第3页 / 共48页
c#排序算法_第4页
第4页 / 共48页
c#排序算法_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《c#排序算法》由会员分享,可在线阅读,更多相关《c#排序算法(48页珍藏版)》请在金锄头文库上搜索。

1、c#排序算法C#算法大全希尔排序希尔排序是将组分段,进行插入排序.对想提高C#语言编程能力的朋友,我们可以互相探讨一下。如:下面的程序,并没有实现多态,来,帮它实现一下。u s i n g Sy s t e m;p u bl i c cl as s Sh e l l So r t e r(p u bl i c v o i d So r t (i n t l i s t)(i n t i n c;f o r(i n c=l;i n c0;i n c/=3)(f o r (i n t i=i n c+l;i i n c)&(l i s t j-i n c-1 t)(l i s t j-l=l i

2、s t j-i n c-1;j-=i n c;l i s t j-l=t;public class MainClasspublic static void Main()(int iArrary=newint 1,5,3,6,10,5 5,9,2,87,12,34,75,33,47);ShellSorter sh=new ShellSorter();sh.Sort(iArrary);for(int m=0;m=13;m+)Console.WriteLine(0”,iArrarym);)已经编译通过.插入排序using System;public class InsertionSorter(pub

3、lic void Sort(int list)(for(int i=l;i0)&(listj-1t)listj=t;)public class MainClass(public static void Main()(int iArrary=newint 1,5,3,6,10,5 5,9,2,87,12,34,75,33,47;InsertionSorter ii=new InsertionSorter();i i.Sort(iArrary);for(int m=0;m iArrary m);)已经编译运行通过.这太简单了,我不做详细介绍了.选择排序using System;public cla

4、ss SelectionSorter(/public enum comp COMPJESS,COMP_EQUAL,C0MP_GRTR;private int min;/private int m=0;public void Sort(int list)for(int i=0;ilist.Length-1;+i)min=i;for(int j=i+l;jlist.Length;+j)if(listjlistmin)min=j;)int t=listmin;listmin=listi;listi=t;/Console.WriteLine(0”,list i);)public class MainC

5、lasspublic static void Main()(int iArrary=newint 1,5,3,6,10,55,9,2,87,12,34,75,33,47);SelectionSorter ss=new SelectionSorter();ss.Sort(iArrary);for(int m=0;m=13;m+)Console.WriteLine(0”,iArrarym);)常见排序算法介绍口非哥 发表于 2 0 0 5-1 0-1 4 2 3:0 0:0 01、稳定排序和非稳定排序简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法

6、是稳定的。反之,就是非稳定的。比如:一组数排序前是al,a2,a3,a4,a5,其 中a2=a4,经过某种排序后为 al,a2,a4,a3,a5,则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成al,a4,a2,a3,a5就不是稳定的了。2、内排序和外排序在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。3、算法的时间复杂度和空间复杂度所谓算法的时间复杂度,是指执行算法所需要的计算工作量。一个算法的空间复杂度,一般是指执行这个算法所需

7、要的内存空间。功能:选择排序输入:数 组 名 称(也就是数组首地址)、数组中元素个数*/算法思想简单描述:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。选择排序是不稳定的。算法复杂度0(n 2)n 的平方*/v o i d s e l e ct _s o r t (i n t *x,i n t n)(i n t i,j,m i n,t;f o r (i=0;i n-l;i+)/*要选择的次数:0 n-2 共 n T 次*/m i n =i;/*假设当前下标为i 的数最小,比较后再调整*/f

8、 o r (j=i+l;j n;j+)/*循环找出最小的数的下标是哪个*/i f (*(x+j)=2 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。直接插入排序是稳定的。算法时间复杂度0(n 2)n的平方*/v o i d i n s e r t _s o r t(i n t *x,i n t n)(i n t i,j,t;f o r (i=l;i=0&t 0;h=k)/*循环到没有比较范围*/(f o r (j=0,k=0;j *(x+j+l)/*大的放在后面,小的放到前面*/t =*(x+j);*(x+j)=*(x+j

9、 +l);*(x+j+l)=t;/*完成交换*/k =j;/*保存最后下沉的位置。这样k 后面的都是排序排好了的。*/)功能:希尔排序输入:数 组 名 称(也就是数组首地址)、数组中元素个数算法思想简单描述:在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.sh e ll于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小

10、的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增里,以后每次减半,直到增量为lo希尔排序是不稳定的。void shell sort(int*x,int n)i n t h,j,k,t;f o r (h=n/2;h 0;h=h/2)/*控制增量*/f o r (j=h;j =0&t *(x+k);k-=h)*(x+k+h)=*(x+k);)*(x+k+h)=t;)功能:快速排序输入:数 组 名 称(也就是数组首地址)、数组中起止元素的下标算法思想简单描述:快速排序是对冒泡排序的一种本质改进。它的基

11、本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。它是由C.A.R.H o ar e 于 1 9 6 2 年提出的。显然快速排序可以用递归实现,当然也可以用栈化解递归实现。下面的函数是用递归实现的,有兴趣的朋友可以改成非递归的。快速排序是不稳定的。最理想情况算法时间复杂度0(n lo g2 n),最坏0(n 2)v o id q u ic

12、k_ s o r t(in t *x,in t lo w,in t high)in t i,j,t;if(lo w high)/*要排序的元素起止下标,保证小的放在左边,大的放在右边。这里以下标为lo w 的元素为基准点*/(i =lo w;j =high;t =*(x+lo w);/*暂存基准点的数*/w hile(i j)/*循环扫描*/w hile(i t)/*在右边的只要比基准点大仍放在右边*/j;/*前移一个位置*/if(i j)*(x+i)=*(x+j);/*上面的循环退出:即出现比基准点小的数,替换基准点的数*/i+;/*后移一个位置,并以此为基准点*/)w hile(i j&*

13、(x+i)=t)/*在左边的只要小于等于基准点仍放在左边*/(i+;/*后移一个位置*/)if(i=h2 i,hi=2 i+l)或(hi=h2 i,hi=2 i+l)(i=l,2,.,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储顺序,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对它们作交换,最

14、后得到有n个节点的有序序列。从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。堆排序是不稳定的。算法时间复杂度0(n l o g 2 n)。功能:渗透建堆输入:数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始*/vo i d s i f t(i n t *x,i n t n,i n t s)i n t t,k,j;t =*(x+s);/*暂存开始元素*/k =s;/*开始元素下标*/j =2*k +1;/*右子树元素下标*/wh i l e (j n)(i f

15、(j n-l&*(x+j)*(x+j+l)/*判断是否满足堆的条件:满足就继续下一轮比较,否则调整。*/j+;)i f (t =0;i一)(s i f t (x,n,i);/*初始建堆*/)f o r (k=n-l;k =l;k一)(t =*(x+0);/*堆顶放到最后*/*(x+0)=*(x+k);*(x+k)=t;s i f t (x,k,0);/*剩下的数再建堆*/vo i d m ai n()f t d e f i n e M A X 4i n t *p,i,a M A X ;/*录入测试数据*/P =a;p r i n t f(I n p ut%d n um be r f o r s

16、 o r t i n g :n,M A X);f o r (i=0;i M A X;i+)s c an f p+);p r i n t f(n);/*测试选择排序*/P =a;s e l e c t _s o r t (p,M A X);/*/*测试直接插入排序*/P =a;i n s e r t _s o r t(p,M A X);/*测试冒泡排序*/P =a;i n s e r t _s o r t(p,M A X);*/*测试快速排序*/*P =a;q ui c k s o r t (p,0,M A X-1);*/*测试堆排序*/*P =a;h e ap s o r t (p,M A X);*/f o r (p=a,i=0;i M A X;i+)p r i n t f (%d ”,*p+);)p r i n t f(n);s ys t e m(p aus e);排序算法C o p yr i g h t :bam bo o t t m.m y 1 6 3.c o m 转载请保留出处计算机处理数据包括排序、检 索(查找)、修改和删除操作。我们研究排序算法有几点充分理由。首先,是因为它

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号