算法学习第一幕:排序算法1
2016-02-17 17:20
260 查看
排序算法应该是大学毕业后用到频率较高的为数不多的几个算法之一,通常情况下根据原理不同分为几个不同的类别,对我个人来说,主要的类别:
1,随意写随意用无视效率的冒泡,插入,选择三种基本排序
2,最常用的效率相对前三种较好的快速排序,快排
3,神特么除了多年写作业刷题库没有遇到过实际应用场景的堆排、归并排序
运行结果:
View Code
少了一次。。。。
效果如图。。。非常非常明显的看到,主要损失的效率在于存在较长的顺序序列时,该方法依然逐个进行。据说改进方法希尔排序属于插入排序升级版,因为并不熟悉,后期研究后加入。
1,随意写随意用无视效率的冒泡,插入,选择三种基本排序
2,最常用的效率相对前三种较好的快速排序,快排
3,神特么除了多年写作业刷题库没有遇到过实际应用场景的堆排、归并排序
冒泡排序
首先我们介绍的是冒泡排序,这个应该是接触排序时学会的第一种排序方式,早在久远的初中普及VB时代就用过冒泡排序,其根本原理是每次比较相近的两处,如果二者顺序与要求的排序顺序相反则交换二者顺序,这样每次应该至少一个元素排到它所应该在的位置void maopao_sort(int a[]) { int temp = 0; for(int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++){ if (a[j] < a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } for(int i =0 ; i<10;i++) cout<<a[i]<<" "; cout<<endl; } }
运行结果:
void maopao_sort2 ( int a[], int n) { int temp = 0; int i = n -1; //初始时,最后位置保持不变 while ( i > 0) { int flag = 0; //每趟开始时,无记录交换 for (int j = 0; j < i; j++) { if (a[j]> a[j+1]) { flag = j; //记录交换的位置 temp = a[j]; a[j]=a[j+1]; a[j+1]=temp; } } i= flag; //为下一趟排序作准备 for(int i =0 ; i<10;i++) cout<<a[i]<<" "; cout<<endl; } }
View Code
少了一次。。。。
插入排序
插入排序在我的理解里就像我们小时候打扑克摸牌,从牌堆里抽排,手初始时是空,然后按照从小到大,或者从大到小顺序排列,手中形成有序序列后,新摸得牌就会顺序检索它应该所在的为止,插入,插入位置后面的牌顺序后移一位void insertSort(int a[], int n) { for(int i = 1; i < n; i++) { if(a[i] < a[i - 1]){ int j = i - 1; int x = a[i]; a[i] = a[i-1]; while(x < a[j]){ a[j+1] = a[j]; j--; } a[j+1] = x; } } }
效果如图。。。非常非常明显的看到,主要损失的效率在于存在较长的顺序序列时,该方法依然逐个进行。据说改进方法希尔排序属于插入排序升级版,因为并不熟悉,后期研究后加入。
选择排序
选择排序,选择最大/最小元素接在已拍好序列后for(int i = 0; i < n; i++){ int min = a[i]; int temp = 0; int index = i; for (int j = i + 1;j < n; j++) { if (a[j] < min) { min = a[j]; index = j; } } temp = a[i]; a[i] = min; a[index]= temp; }
快速排序
快速排序,使用了分治和递归的方法,将排序的时间复杂度降到了nlgn,虽然不稳定,属于常用的理解很方便的一种排序,主要原理: 任选数组头尾任一元素作为标尺flag,将小于flag的元素放到左边,大于flag的元素放到右边,这样形成了两个小的序列,随后对这两个小序列如上方法进行递归。网上可以直接搜索快速排序gif,很简洁明了的告诉如何实现的。void quick_sort(int a[], int left, int right) { if(left<right) { int i = left; int j = right; int x = a[i]; while(i<j) { while(i<j&&a[j]>x) j--; if(i<j){ a[i] = a[j]; i++; } while(i<j&&a[i]<x) i++; if(i<j){ a[j] = a[i]; j--; } } a[i] = x; quick_sort(a, left, i-1); quick_sort(a, i+1, right); } }
相关文章推荐
- ffmpeg文档03-详细说明
- 创建自定义的指令
- Java CookBook--Creating a Priority Queue--by Tim O'Brien 整理by博主
- 8.iOS 字体类型列表
- Unity_UGUI研究院之UI的深度学习(二)
- 开工了,发个招聘~长虹智能交易平台英雄帖(有截止日期,其实长期有效,标题要长,:)
- ffmpeg文档01-命令语法
- 一:集中式向分布式系统过度
- hdu2571 命运(简单DP)
- java 连接 mysql
- Android默认输入法设置
- Android scroll 分析
- Nodes之Get和Post请求
- Linux内存管理之mmap详解
- 为什么修改下时间苹果手机就“变砖”?
- 微服务API模拟框架frock介绍
- ffmpeg文档02-描述/概览
- leetcode 175. Combine Two Tables
- 子div在父div中居中。
- centos(linux)普通用户设置sudo权限