c精典语言算法.docx

上传人:b****4 文档编号:891355 上传时间:2022-10-13 格式:DOCX 页数:16 大小:23.71KB
下载 相关 举报
c精典语言算法.docx_第1页
第1页 / 共16页
c精典语言算法.docx_第2页
第2页 / 共16页
c精典语言算法.docx_第3页
第3页 / 共16页
c精典语言算法.docx_第4页
第4页 / 共16页
c精典语言算法.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

c精典语言算法.docx

《c精典语言算法.docx》由会员分享,可在线阅读,更多相关《c精典语言算法.docx(16页珍藏版)》请在冰豆网上搜索。

c精典语言算法.docx

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个和第

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1