我的方位: 主页 > 学习专区 > JAVA技术 >
抢手专题更多 >
抢手标签更多 >
C言语的根本排序算法
时刻:2016-08-10 09:55:15   来历: 东莞fun88网金码校区
咱们都在重视:东莞fun88网 fun88网好吗
共享到:
[导读] 语法是言语的特征,而算法却是魂灵算法不分言语入门的算法要数排序算法今日的算法解说将以c言语为比方将以下几个排序算法1 桶排序2 插

语法是言语的特征,而算法却是魂灵

算法不分言语

入门的算法要数排序算法

今日的算法解说将以c言语为比方将以下几个排序算法

1. 桶排序

2. 刺进排序

3. 冒泡排序

4. 快速排序

首先给咱们介绍一个最简略粗犷的排序算法

桶排序

桶排序要先知道要排序的数的规模

然后要这么多的桶去装这些或许呈现数的次数

 

 

//这儿的规模是0~999

int b[1000];

这个数组便是用来装呈现次数的

然后输入数字,然后这个相应的桶的次数就加1

输出时遍历悉数桶,然后桶的数字是几就输出几回这个数字

代码如下

#include

int main(){

int num;

//弄一个大桶装一切或许呈现的数,用来记载每个数字呈现的次数,桶的个数是或许呈现的最大值

int b[1000]={0};

int i,j;

for(i=0;i<10;i++){

scanf("%d",&num);

//该数字呈现次数+1

b[num]++;

}

for(i=0;i<1000;i++){

//桶有装有几个数就输出几回

for(j=0;

这办法够简略够粗犷吧

其实这办法还可以优化一下

咱们尽管是知道规模,但输入的数的规模或许要比给出的规模少得多,这样的话遍历悉数桶就很糟蹋时刻了

所以咱们可以找到输入数字的最大值和最小值,只需遍历最大值和最小值之间的桶就行了,因为其他桶都是0,不必输出所以代码就可以改为

#include

int main(){

int num;

//弄一个大桶装一切或许呈现的数,用来记载每个数字呈现的次数,桶的个数是或许呈现的最大值

int b[1000]={0};

int max=0;

int min=1000;

int i,j;

for(i=0;i<10;i++){

scanf("%d",&num);

//该数字呈现次数+1

b[num]++;

/ 到最大值,后边输出可以节省时刻,最大值后边的桶都是0,也可以再找最小值,最小值前面的桶都是0

if(num>max){

max=num;

}

if(num

桶的编码对应的是它记载的数字然后有人就问假如有负数怎么办负数的话,把悉数桶平移一下就好,输出时把桶的编码再减去平移值

比方规模是-10~9

可以开个数组int b[20];

输入的话便是b[num+10]++

输出的话printf(“%d “,i-10);

这个算法大约便是这样了,尽管说是简略,可是咱们通常状况下是不知道切当的规模的,假如以最大规模去拓荒桶就会很糟蹋空间然后接下来讲第二种算法刺进排序刺进排序的根本思维是,从第二个数开端,刺进到前面有序序列的方位

 

 

比方说3个数,分别是5,4,2

然后从第二个数开端

4比5小,应该插到5的前面

然后5撤退一位

现在的序列编程4,5,2然后到第三个数2

2应该插到4前面

所以4和5都要撤退一位

现在就变成2,4,5的有序序列了详细代码是这样#include

int main(){

int a[1000];

int b;

int i;

for(i=0;i<10;i++){

scanf("%d",&a[i]);

//还可以在输入的时分就排序了

}

for(i=1;i<10;i++){

int temp=a[i];

int n=i-1;

//跟前面的比较,小的话就向前,而且该位向后移动一位

while(n>-1&&temp第二个for循环i=1便是从第二个数开端或许需求咱们一点抽象思维去幻想比方排队

是按号排队的

他迟到了

然后他就拿这号从最终一位一向向前问

后边的都比他大,总算找到一个比他小的

他不或许排他前面,所以只能排他后边

然后他就插队进去了

他后边的人都被他挤后了一位接下来介绍另一种排序算法冒泡排序冒泡排序的思维是,每次把最小的数冒到左面

就像气泡相同越挨近水面的泡泡越大

 

 

持续是以刚刚的数列5,4,2为例

从榜首个数开端

5比4大,然后就交流

4比2大然后就交流

然后现在的序列是2,5,4

然后到第二个数开端

5比4大,交流方位

然后这个序列就排好了详细代码如下#include

int main(){

int a[1000];

int i,j,temp;

for(i=0;i<10;i++){

scanf("%d",&a[i]);

}

for(i=0;i<9;i++){

//跟后边的一切数进行比较,大的就交流

for(j=i+1;j<10;j++){

//交流

if(a[i]>a[j]){

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

}

for(i=0;i<10;i++){

printf("%d ",a[i]);

}

return 0;

} 这种排序办法是初学者有必要把握的一种排序办法最终讲一种高档一点的算法快速排序把握这种办法可以说是初学者的分水岭这种排序办法包含了递归和分治的思维递归咱们最了解的便是山公吃桃最终一天剩一个,每天吃总数的一半,吃了五天,然后问你最开端有多少个桃子然后便是从最终一天开端算,一向算到榜首天分治便是,讲一个问题分隔处理但分隔处理是没有影响的就比方扫地可以扫地分为扫客厅和扫房间快速排序的思维是从给一个数组,然后在数组中找一个基准值两头派一个战士去帮我找数要从右边的战士开端右边的战士要找一个比基准值小的数找到后停下来等左面的战士左面的战士要找一个比基准值大的数找到后就停下来,交流这两个数的方位交流后持续找,直到他们相遇相遇时这个数必定比基准值小咱们直到为啥吗咱们有一个很要害的一步从右边开端右边停下的方位必定是小于基准值的相遇后相遇的数和基准值交流,咱们这儿取最左面的数为基准值交流之后,基准值的左面都是比基准值小的,基准值右边都是比基准值大的然后就按相同的规矩排基准值的左面和右边排序时不只要传入数组,还要传入规模一旦排到左面界等于右边了就不必排了,就可以return返回了代码如下#include

int main(){

int a[1000];

int i;

for(i=0;i<10;i++){

scanf("%d",&a[i]);

}

quicksort(a,0,9);

for(i=0;i<10;i++){

printf("%d ",a[i]);

}

return 0;

}

void quicksort(int a[],int left,int right){

if(left>=right){

return;

}

int low=left;

int high=right;

//这个基准值可以随意取,只要在left和right规模内就好

int key=a[left];

while(low!=high){

//次序很重要,要先从右边开端找

//因为最终交流时左面的要都比基准小

//右边大于基准值就越过

while(low=key){

high--;

}

//左面小于基准值就越过

while(low假如咱们理解了这种算法,对c言语的造就就会深一层

这篇关于快速排序博客有配图愈加形象这儿讲的都是从小到大的排序,咱们可以考虑一下用这几种算法怎么从大到小排序