浅谈简化版排序
来源:互联网 发布:1099端口被占用 编辑:程序博客网 时间:2024/06/05 07:58
排序
最近,粗略的学习了算法的入门小白级算法书,《啊哈!算法》,作为一个算法小白,不得不说这本书写得及其浅显易懂,果真是为完全小白准备的。之前没有接触过算法的任何学习,现在简单的分享一下自己关于排序算法的一点收获,各位算法大神请绕道,谢谢。
桶排序
排序,我将它理解为将一组无序数据按一定的方式排列为有序的数据。而桶排序,是一种比较简单粗暴的方式吧。
这个讲的就是将类似于【4,5,2,5,1】这样的数字排序的话,我们选用数组来完成排序。我们将数组的下标当做要排序的数的更大的一个集合,而数组初始化值为零,当有下标值得数出现时,将数组的值加1。数组的值表示数据出现的次数,在需要输出时,将相应的数据输出。
用一个book[6]数组进行排序,将各个数据出现次数存入,在需要输出时,按照数组值表示的个数来输出就好。
实现代码:
#include <stdio.h>int main(){ int book[6],i,j,t; //初始化 for(i=0;i<=6;i++) book[i]=0; //开始排序 for(i=1;i<=5;i++) { scanf("%d",&t);//读入数据 book[t]++;//进行计数 } //排序结束 //如需要输出,则, for(i=1;i<=5;i++) for(j=1;j<=book[i];j++)//出现几次打印几次 printf("%d",i); getchar();getchar();//暂停程序,查看输出return 0;}
桶排序的时间复杂度是O(m+n),时间上非常快,不过,当数据跨度较大时,浪费的空间会很多。也就是以空间的牺牲换取时间。所以桶排序适合数据比较接近的数据,空间利用会比较好。
冒泡排序
记得冒泡排序是最开始在学习C语言的时候接触到的,当时画了多少工夫才理解,确实比较笨。冒泡排序的思想是:每次比较两个相邻元素,如果他们的顺序错误,就把它们交换过来。
冒泡排序的原理是,每次只能有一个数归位,它的实现过程,是将相邻的两个数进行比较,将较大或较小的那个数(取决于你要怎样排序)放在相应的位置,进过一轮之后,会将最大或者最小的那个数放在最后,第二次会确定倒数第二位上的数……以此类推,知道n-1轮之后,所有的数按照一定的顺序排好。
实现代码:
#include <stdio.h>int main(){ int a[100],t,n,i,j; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]);//读入n个数到数组中 //开始排序 for(i=1;i<n-1;i++) for (j=1;j<n;j++) { if (a[j]<a[j+1]) //比较大小,此处按照从大到小排序 { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } //排序结束 //若需要输出结果,则, for(i=1;i<=n;i++) printf("%d ",a[i]); getchar();getchar(); return 0;}
冒泡排序的核心在于双重嵌套循环,时间复杂度为O(N^2)。时间复杂度非常高,各大改进也没有什么突破性的进展。
快速排序
桶排序在时间复杂度上非常好,但空间浪费严重;冒泡排序在空间上及其节约,只需要数据存放的空间就可以,不需要为排序新开辟空间,但时间复杂度非常高。而快速排序可以既不浪费空间也可以节约时间。
快速排序是基于“二分”的思想,方法是设定一个基准数(默认我们使用第一个数,比较方便)从序列两边开始查找,(这里我们假设从小到大排序,从大到小就是找数时放的与基准数的大小反过来)从左向右找小于基准数和大于基准数的两个数交换位置,直到相遇是停止,停止数与基准数交换位置。以基准数为分界点,分别对前后两段序列进行重复操作。(此时可以使用递归)
实现代码:
#include <stdio.h>int a[101],n; //定义全局变量在两个函数中使用void quicksort(int left, int right){ int i,j,t,temp; if(left>right) return; temp=a[left]; i = left; j = right; while(i!=j) { //一定要先从右往左找 while(a[j]>=temp && i<j) j--; while(a[i]<=temp &&i<j) i++; //交换两数的位置 if(i<j) { t=a[i]; a[i]=a[j]; a[j]=t; } } //将基准数归位 a[left]=a[i]; a[i]=temp; quicksort(left,i-1);//递归继续处理左边的序列 quicksort(i+1,right);//递归继续处理右边的序列 return;}//主函数int main(){ int i; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]);//读入n个数到数组中 quicksort(1,n);//快速排序调用 //若需要输出结果,则, for(i=1;i<=n;i++) printf("%d ",a[i]); getchar();getchar(); return 0;}
暂时就这么多啦,持续更新中……
- 浅谈简化版排序
- listView排序,简化版
- 简化版桶排序
- 简化版桶排序
- 啊哈算法学习-简化版桶排序
- 简化的插入排序
- 简化的插入排序
- [Simple Algorithms] Lesson1 简化版的桶排序
- S3:VB之15个数的排序(简化版)
- 每日一个小算法-简化版桶排序
- 算法入门——简化版桶排序
- 浅谈排序
- 浅谈排序
- 作业:简化的插入排序
- 浅谈css代码的简化缩写
- 【连载】快速排序算法的普通版和简化版实现
- 简化的桶排序(Bucket Sort)
- 简化SQL式计算之固定排序
- linux kernel的中断子系统之(七):GIC代码分析
- 学习java中 亲身体会Java中关于equals: 变量.equals("字符串") VS "字符串".equals(变量)
- RecyclerView嵌套RecyclerView报ViewHolder类型不匹配错误
- 【dp专题1】F
- jquery parent和parents的区别
- 浅谈简化版排序
- kafka登入报错
- Error:Execution failed for task ':app:transformClassesWithDexForDebug'
- requirejs加载文件
- 关于Linux上SAMBA服务的权限问题(多用户挂载)
- vector 去重模板
- Ubuntu14.04中Failed building wheel for cffi,lxml,crypt
- 百度秘钥无效的解决方法
- 如何一个电脑配多个不同版本的jdk,