c语言基础算法(一)---排序
来源:互联网 发布:mac终端建立文件夹 编辑:程序博客网 时间:2024/05/22 15:31
c语言简单排序算法
在c语言学习中,排序算法很重要,在学完数组后,就必须学会排序算法,不论是刷题还是做一些东西,都必须掌握,下面介绍几种简单的排序算法。
桶排序–最简单最快的排序
桶排序,从名字上都觉得蛮有意思的,它实现的方法很简单,就是弄一大堆桶,每个桶上按顺序贴上标签,比如我要10个数排序,这10个数的范围是0到100,于是我就创建一个啊a[101]的数组数组,也就是100个桶,下标就是代表该桶的值。然后排序的时候,出现一个数,就让该数值的桶里面放个石头,也就是该数组元素的值+1,然后排序的时候,就可以从第一个桶开始数,看里面有石头没,有几个,如果有就输出该桶上的值,没有就看下一个,这样就从小到大排序了哈,如果想从大到小排序,就从最后一个桶开始往前数。
#include <stdio.h>int main(void){ int book[1000],i,j,k,t,n; //输出数字的范围是0到999,也就是999个桶 for(i = 0;i < 1000;i++) { book[i] = 0; //清空数组,也就是所有桶里一开始没有石头 } scanf("%d",&n); //输入你要排序多少个数 for(i = 0;i < n;i++) //循环读入n个数 { scanf("%d",&t); book[t]++; //桶里放石头哈 } for(i=1000;i>=0;i--) //从大到小排序 { for(j=0;j<book[i];j++) { printf("%d ",i); //有几个石头就输出几次 } ` } return 0;}
桶排序速度快,简单,但是它是用空间来换取时间,占的内存大,可以去重复的数字特别方便,这个只是简单的桶排,只能处理不是特别大的数字。
快速排序
在快速排序算法中,使用了分治策略。首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束。
步骤如下:
在序列中选择一个关键元素做为轴;
对序列进行重新排序,将比轴小的元素移到轴的前边,比轴大的元素移动到轴的后面。在进行划分之后,轴便在它最终的位置上;
递归地对两个子序列进行重新排序:含有较小元素的子序列和含有较大元素的子序列。
下面的动画展示了快速
排序算法的工作原理。
#include <stdio.h>int a[1000];void sort(int a[],int left,int right){ int i=left; int j=right; int temp=a[left]; if(left<right) { while(i < j) { while(a[j]>temp&&i<j){ j--; } a[i]=a[j]; while(a[i]<temp&&i<j){ i++; } a[j]=a[i]; } a[i]=temp; sort(a,left,i-1); sort(a,j+1,right); } else { return; }}int main(void){ int n,i; scanf("%d",&n); for(i = 0;i < n;i++) { scanf("%d",&a[i]); } sort(a,0,n-1); for(i = 0;i < n;i++) { printf("%d ",a[i]); } return 0;}
这个我写的快排函数感觉有点和书上写的不太一样,但是能用,尴尬。
快排里面用到了,分治的想法,递归处理,速度较快,但是不稳定。
冒泡排序
自己对冒泡排序这个名字觉得蛮有意思的,就像鱼鱼吐泡泡一样,小的数不断往上跑,其实这个算法也蛮简单的,就是两重循环,大的循环是要走的趟数,趟数是n-1,n为要排序的数的个数,小循环里面是每循环一次,就把改数组里最大的或最小的数放到最后面,下一次小循环,就把剩下的数,最大的或最小的放在剩下的数的最后面,这样就完成了从小到大排序或从大到小排序。
#include <stdio.h>int main(void){ int a[100],i,j,t,n; scanf("%d",&n); //输入要排序的数的个数 for( i =0;i< n;i++) { scanf("%d",&a[i]); } //冒泡排序的核心部分 for(i =0;i<n-1;i++) { for(j=0;j<n-i;j++) { if(a[j]<a[j+1]) { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } for(i =0 ;i < n;i++) { printf("%d",a[i]); } return 0;}
冒泡排序有两重循环,时间复杂度高
总结
以上就3种简单的排序,还有许多排序方法,这里的排序算法都按我自己的理解写解释了下,哇咔咔。
- c语言基础算法(一)---排序
- C语言常用排序算法(一)
- C语言算法(一)基础
- 排序算法(一) c语言
- C语言---排序算法-------直接插入排序(一)
- C语言基本算法五排序【基础认知(理论)】
- C语言几种常见排序算法(一)
- 一天一算法:C语言冒泡排序
- C语言基础,排序算法之冒泡排序算法
- 排序算法(C语言)
- c语言基础(一)
- C语言基础(一)
- C语言基础(一)
- C语言基础(一)
- C语言基础(一)
- C 语言基础(一)
- c语言基础(一)
- C语言基础(一)
- tensorflow 学习之 cifar_10 模型定义
- 【题解】Round Numbers
- 线程小总结
- python mysql数据库的操作
- 编写strcpy函数
- c语言基础算法(一)---排序
- AFNetworking数据请求(深度封装)
- MySql-Set字段类型
- 稳定
- POJ.1797 Heavy Transportation (Dijkstra变形)
- mac上安装hadoop
- PHP面向对象编程中的魔术方法__clone()
- bzoj3626[LNOI2014]LCA 树链剖分
- tensorflow学习笔记(2)——基础(二)——张量和会话