算法基础--基本排序算法总结·
总结了插入、冒泡、快速排序、选择排序、堆排序、基数排序、归并排序7种排序算法
public class CSort{//插入public void d_insort(int[] a){if (a.Length < 1) return;int i, j, t;for (i = 1; i < a.Length; i++){t = a[i];for (j = i - 1; j >=0 && t < a[j];j-- )//把大于t的元素后移 {a[j + 1] = a[j];}a[j + 1] = t;//插入t }}//冒泡public void BubbleSort(int[] a){if (a.Length < 1) return;int i, j, t;i = a.Length;while (i > 1){//每次循环把最大的数放入有序序列的第一个for (j = 0; j < i - 1; j++){if (a[j + 1] < a[j]){t = a[j];a[j] = a[j + 1];a[j + 1] = t;}}i--;}}//快排public void quickSort(int[] a){if (a.Length < 1) return;qSort(a, 0, a.Length - 1);}private void qSort(int[] a,int left,int right){//从left到right进行按left索引值进行分块//递归到1if (right - left < 1) return;int i = left, j = right;int x = a[i];while (i < j){while ((a[j] >=x) && (i<j))j --;a[i] = a[j];while ((a[i] <= x) && (j > i))i++;a[j] = a[i];}a[i] = x;qSort(a, left, i - 1);qSort(a, i + 1, right);}//选择排序public void SelectSort(int[] a){if (a.Length < 1) return;sSort(a, 0);}private void sSort(int[] a, int start){//从start开始选择最小与start交换if (start == a.Length) return;int index = start;for (int i = start+1; i < a.Length; i++){if (a[index]> a[i]){index = i;}}int t = a[start];a[start] = a[index];a[index] = t;sSort(a, start + 1);}//堆排序public void heapSort(int[] a){int t;int n=a.Length;for(int i=n/2;i>=0;i--)//初始堆 SIFT(a,i,n);for (int i = n - 1; i >= 0; i--)//排序{//交换t = a[0];a[0] = a[i];a[i] = t;SIFT(a, 0, i - 1);//剩下的堆重新构造 }}private void SIFT(int[] a, int i, int n){//构造堆 /逆堆int j, T;T = a[i]; j = 2 * i;while (j < n){if ((j < n) && (a[j] < a[j + 1])) j++;if (T < a[j]){a[i] = a[j];i = j;j = 2 * i;}else{j = n;}a[i] = T;}}//基数排序public void rSort(int[] a){if (a.Length < 1) return;// rl_sort(a,1,3);rr_sort(a, 0,a.Length-1,3);}private void rl_sort(int[] a,int d,int k){//lsd 低位到高位if (d > k) return;int begin = 0, end = a.Length-1;const int radix = 10;int[] count = new int[radix];//基数右索引int[] bucket = new int[a.Length];//缓存for (int i = begin; i <= end; i++){count[get(a[i], d)]++;//每个关键码的个数 }for (int i = 1; i < radix; i++){count[i] = count[i] + count[i - 1];//累加个数,对应右边界索引 }for (int i = end; i >=begin; i--){int j = get(a[i], d);//求关键码bucket[count[j] - 1] = a[i];//放入对应的索引位置count[j]--;//放一个右索引左移一 }for (int i = begin, j = 0; i <= end; i++, j++){a[i] = bucket[j];}rl_sort(a,d + 1,k);// 高位one more try }private void rr_sort(int[] a,int begin,int end,int d){//MSD//高位到低位const int radix = 10;int[] count = new int[radix];//基数索引int[] bucket = new int[a.Length];//缓存for (int i = begin; i <= end; i++){count[get(a[i], d)]++;}for (int i = 1; i < radix; i++){count[i] = count[i] + count[i - 1];}for (int i = end; i >= begin; i--){int j = get(a[i], d);bucket[count[j] - 1] = a[i];count[j]--;//循环减完了就变左边界了 }for (int i = begin, j = 0; i <= end; i++, j++){a[i] = bucket[j];}for (int i = 1; i < radix; i++)//0不用循环,高位必须是1开始 {int p1 = begin+ count[i-1];int p2 = begin+count[i] - 1;if (p1 < p2 && d > 1){rr_sort(a, p1, p2, d - 1);}}}private int get(int a,int reg){int[] d = { 1, 1, 10, 100,1000 };return (a / d[reg]) % 10;}//归并排序public void mergeSort(int[] a){if (a.Length < 1) return;mSortPass(a, 1);}private void mSortPass(int[] a,int len){if (a.Length<len) return;int s = 0;while (s + 2 * len-1 < a.Length){mSort(a, s, s + len, s + 2 * len - 1);s = s + 2 * len;}int c = 0;if (s - 2 * len < 0){s = 0;c = len;}else{s = s - 2 * len;c = s + 2 * len;}if (s< a.Length - 1)//最后一个序列 {mSort(a, s, c, a.Length - 1);}mSortPass(a, 2 * len);}private void mSort(int[] a,int s1,int s2,int l2){int tlen=l2 - s1 + 1;int[] temp = new int[tlen];int i = s1, j = s2, k = 0;while (i < s2 && j <= l2)//把小的添加到缓冲 {if (a[i] <= a[j]){temp[k] = a[i];i++;k++;}else{temp[k] = a[j];j++;k++;}}//剩下的添加到缓冲while (i < s2){temp[k] = a[i]; i++;k++;}while (j <= l2){temp[k] = a[j];j++;k++;}Array.Copy(temp, 0, a, s1, tlen);//复制 }}
转载于:https://www.cnblogs.com/onegarden/p/5599870.html
算法基础--基本排序算法总结·相关推荐
- 算法基础:排序算法之冒泡排序
算法基础:排序算法之冒泡排序 实现:数列有序排序 思想:已知一个数列,令数列中相邻的两个元素一一做比较,按照小大的顺序(或从大到小的顺序),如果前一个数比后一个数大(或后一个数比前一个数大),则互换( ...
- 数据结构基础和排序算法
数据结构和算法 1. 数据结构 1.1 稀疏数组 这个简单 稀疏数组即二维数组中有大量为0或同一个无效值的时候,将其压缩为只有有效数据的稀疏数组,需要使用时将其读写出来转为二维数组. public c ...
- 数据结构和算法之五:排序算法二
数据结构基础之排序算法二 学习算法,排序算法当然是不能少的,这次我们来学习一下基础的选择排序,冒泡排序,以及大名鼎鼎的快速排序. 选择排序 选择排序,非常好理解,就是找最小的数放到第一位,然后从第二个 ...
- GIS算法基础——左转算法拓扑生成
GIS基础算法目录 GIS算法基础--左转算法拓扑生成 GIS算法基础--矢量数据压缩道格拉斯普克压缩算法(非递归实现) GIS算法基础--左转算法拓扑生成 GIS基础算法目录 基于JavaScrip ...
- 《算法基础:打开算法之门》一1.5 拓展阅读
本节书摘来自华章出版社<算法基础:打开算法之门>一书中的第1章,第1.5节,作者 [美]托马斯 H 科尔曼(Thomas H Cormen),更多章节内容可以访问云栖社区"华章 ...
- 数据结构之排序算法:内部排序算法的应用与比较
排序算法:内部排序算法的应用与比较 思维导图: 比较: 应用: 思维导图: 比较: 应用:
- 冒泡排序算法和选择排序算法比较
冒泡排序算法详细内容见→冒泡排序算法. 选择排序算法详细内容见→选择排序算法. 冒泡排序算法和选择排序算法的区别: 冒泡排序是比较相邻位置的两个数:而选择排序是按顺序比较,找出最大值或者最 ...
- ACM基础之排序算法
在ACM基础知识中,排序是一种比较基础但又比较重要的思想,熟练地掌握排序算法十分有必要.排序的方法比较多,这里重要介绍三种排序:选择排序.插入排序.冒泡排序. 一.选择排序 1.基本思想:在要排序的一 ...
- python基础===八大排序算法的 Python 实现
本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...
- 深圳大学算法实验一——排序算法性能分析
深圳大学算法实验一 一.实验目的与要求 1. 掌握九种排序算法原理 2. 掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性. 3. 对多种排序算法提出改进方案 4. 综合比较各种 ...
最新文章
- 一步一步实现iOS QQ第三方登录
- mysql表的类型_浅谈MySQL表类型
- OpenCV文档阅读笔记-Imread flags解析与实例(保存透明图像)
- 牛客网-《剑指offer》-跳台阶
- springAOP之代理
- PID控制器开发笔记(转)
- [GZOI2017]取石子游戏
- JavaScript的Forms验证-Parsley.js
- JDK的代码:抱怨FreeType的斜体不好用,自行处理
- 电视机魔百盒显示连接服务器失败,【当贝市场】魔百盒EPG主页加载不出来办法详解...
- python mkv转mp4,如何将mkv格式转换成mp4视频呢
- Scratch(三十八):八大行星
- 物联网技术应用在智慧医疗的应用案例
- 解决win2003里IIS运行ASP时出现请求资源在使用中的问题
- ckplayer ajax,谁能帮我做一个脚本啊?能让这个网页视频播放可以拉动进度条 可以快进...
- 再次出现用户净流失,大失颜面的中国移动推出超低价套餐争取用户
- 《Effective Python 编写高质量Python代码的59个有效方法》读书笔记
- HDU 6194 string string string
- html图片的宽度和高度设置,CSS设置img图片的宽度和高度
- 如何访问kubernetes API?