c精典语言算法.docx
- 文档编号:891355
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:16
- 大小:23.71KB
c精典语言算法.docx
《c精典语言算法.docx》由会员分享,可在线阅读,更多相关《c精典语言算法.docx(16页珍藏版)》请在冰豆网上搜索。
c精典语言算法
见排序算法(冒泡,选择,快速)的C语言实现
要实现这几种算法的关键是要熟悉算法的思想。
简单的说,冒泡排序,就如名字说的,每经过一轮排序,将最大的数沉到最底部。
选择排序的思想是将整个数列,分为有序区和无序区。
每轮排序,将无序区里的最小数移入到有序区。
快速排序的思想是以一个数为中心,通常这个数是该数列第一个数,将整个数列分为两个部分,一个部分是大于这个数的区域,一个部分是小于这个数的区域。
然后再对这两个部分的数列分别排序。
如果将数列分为两个部分是通过,一方面从后向前的搜索,另一方面从前向后的搜索来实现的。
具体的参考后面的来自XX百科的文档。
从这几个简单的排序算法上看,有几个特点:
冒泡排序是最简单的,也是最稳定的算法。
选择排序不太稳定,但是效率上较冒泡还是有较大的提升。
其实在分析的过程中就能发现,选择排序和冒泡排序相比,中间少了很多的交换过程,和比较的次数,这个应该是时间较少的原因。
选择排序能够满足一般的使用。
当比较的数超过以万为单位时,选择排序也还是要一点时间的。
快速排序据说是最快的。
这个可以从思想上看的出来。
,当记录较多的时候,快速排序的比较循环次数比上面2个都要少。
但是在具体的实现过程中,并不见得如此。
这是因为递归效率的低下导致的。
当然,估计在实际使用过的过程,快速排序估计都会使用非递归操作栈的方式来实现。
那样应该会效率高伤不少。
估计我会在后期出一个快速排序的非递归实现来真正比较它们3个性能。
在下面的程序中,可以通过调高N的数字就能看的出来冒泡排序和选择排序性能的差异。
在N较小,大概几百的时候,是看不出来的。
N较大的的时候,比如N=1000或者N=10000的时候,快速排序的递归实现就会卡死在那里了,出不了结果。
以下是具体的代码:
/*
**常见排序算法比较
*/
#include
#include
#include
#include
#defineN10
#defineDemo1
voidBubbleSort(intarr[],intn);
voidSelectSort(intarr[],intn);
voidQuickSort(intarr[],intn);
voidPrintArray(intarr[],intn);
voidGenerateArray(intarr[],intn);
intmain(intargc,char*argv[])
{
intarr[N];
GenerateArray(arr,N);
#ifDemo
printf("Beforethebubblesort------------------------\n");
PrintArray(arr,N);
#endif
printf("StartBubblesort----------------------\n");
clock_tstart_time1=clock();//开始计时
BubbleSort(arr,N);
clock_tend_time1=clock();//结束计时
printf("Runningtimeis:
%lfms\n",(double)(end_time1-start_time1)/CLOCKS_PER_SEC*1000);//输出运行时间
#ifDemo
printf("Afterthebubblesort------------------------\n");
PrintArray(arr,N);
#endif
printf("-----------------------------------------------------------\n");
sleep(1000);//单位是毫秒即千分之一秒
GenerateArray(arr,N);
#ifDemo
printf("Beforetheselectionsort------------------------\n");
PrintArray(arr,N);
#endif
printf("Startselectionsort----------------------\n");
clock_tstart_time2=clock();//开始计时
SelectSort(arr,N);
clock_tend_time2=clock();//结束计时
printf("Runningtimeis:
%lfms\n",(double)(end_time2-start_time2)/CLOCKS_PER_SEC*1000);//输出运行时间
#ifDemo
printf("Aftertheselectionsort------------------------\n");
PrintArray(arr,N);
#endif
printf("-----------------------------------------------------------\n");
sleep(1000);//单位是毫秒即千分之一秒
GenerateArray(arr,N);
#ifDemo
printf("Beforethequicksort------------------------\n");
PrintArray(arr,N);
#endif
printf("Startquicksort----------------------\n");
clock_tstart_time3=clock();//开始计时
QuickSort(arr,N);
clock_tend_time3=clock();//结束计时
printf("Runningtimeis:
%lfms\n",(double)(end_time3-start_time3)/CLOCKS_PER_SEC*1000);//输出运行时间
#ifDemo
printf("Afterthequicksort------------------------\n");
PrintArray(arr,N);
#endif
system("PAUSE");
return0;
}
//产生随机列表
voidGenerateArray(intarr[],intn)
{
inti;
srand((unsigned)time(0));
for(i=0;i { arr[i]=rand();//生成随机数范围在0-32767之间 } } //打印列表 voidPrintArray(intarr[],intn) { inti=0; for(i=0;i printf("%6d",arr[i]); printf("\n"); } //经典冒泡排序 voidBubbleSort(intarr[],intn) { inti=0,j=0; for(i=0;i for(j=0;j { if(arr[j]>arr[j+1]) { arr[j]=arr[j]^arr[j+1]; arr[j+1]=arr[j]^arr[j+1]; arr[j]=arr[j]^arr[j+1]; } } } //快速排序的递归实现 voidQuickSort(intarr[],intn) { if(n<=1) return; inti=0,j=n-1; intkey=arr[0]; intindex=0; while(i { //从后向前搜索 while(j>i&&arr[j]>key) j--; if(j==i) break; else { //交换a[j]a[i] arr[j]=arr[j]^arr[i]; arr[i]=arr[j]^arr[i]; arr[j]=arr[j]^arr[i]; index=j; } //从前向后搜索 while(i i++; if(i==j) break; else { //交换a[i]a[j] arr[j]=arr[j]^arr[i]; arr[i]=arr[j]^arr[i]; arr[j]=arr[j]^arr[i]; index=i; } } QuickSort(arr,index); QuickSort(arr+index+1,n-1-index); } //选择排序 voidSelectSort(intarr[],intn) { inti,j; intmin; for(i=0;i { intindex=0; min=arr[i]; for(j=i+1;j { if(arr[j] { min=arr[j]; index=j; } } if(index! =0)//表明无序区有比arr[i]小的元素 { arr[i]=arr[i]^arr[index]; arr[index]=arr[i]^arr[index]; arr[i]=arr[i]^arr[index]; } } } 程序里有几点注意的地方: 一,在程序里,交换2个数,我使用了异或来处理。 这个可以根据个人喜好。 为了避免产生临时变量,可以使用如下几种方式来交换2个数: a=a^b; b=a^b; a=a^b; 或者 a=a+b; b=a-b; a=a-b; 使用第二种也挺好的。 第一种异或的方式,只适用于,2个数都为int型的,a,b可以正可以负,这个没有关系,但是必须是int类型。 二,sleep()函数是包含在windows.h里面的,要加入#include 三,关于随机数生成的2个函数srand()种子发生器函数,还有rand()随机数生成器函数,自己可以参考相关文档。 四,Demo宏来控制是演示还是比较性能用的。 当把N调整的很小,比如10的时候,可以设置Demo为1,那样就能打印数组了,可以看到比较前后的情况。 当把N调整到很大比如10000的时候,就把Demo设置为0,那样就不打印数组,直接比较性能。 具体的算法文档参考下面的: 冒泡排序 基本概念 冒泡排序(BubbleSort)的基本概念是: 依次比较相邻的两个数,将小数放在前面,大数放在后面。 即在第一趟: 首先比较第1个和第
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 算法