博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构排序问题---选择---希尔---归并
阅读量:6418 次
发布时间:2019-06-23

本文共 3198 字,大约阅读时间需要 10 分钟。

选择排序基本思路:设个基准,然后通过循环对比找出最小的

时间复杂度:O(n2)

/** *  */package com;/** * @author wenb * @time 下午01:41:21 * @date 2014-10-24 */public class SelectSort {        public static void main(String[] args){                int[] a = {
1,3,2,21,5,12,98,54}; Select(a); for(int i=0;i
i;j--){ if(a[j]

希尔排序基本思路:将整个无序列分割成若干小的子序列分别进行插入排序

时间复杂度:O(n2)

/** *  */package com;/** * @author wenb * @time 下午02:44:18 * @date 2014-10-24 */    public class ShellSort {                public static void main(String[] args) {                    int[] a = {
1,3,2,21,5,12,98,54}; shellSort(a); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } public static void shellSort(int[] data) { // 计算出最大的h值 int h = 1; while (h <= data.length / 3) { h = h * 3 + 1; } while (h > 0) { for (int i = h; i < data.length; i += h) { if (data[i] < data[i - h]) { int tmp = data[i]; int j = i - h; while (j >= 0 && data[j] > tmp) { data[j + h] = data[j]; j -= h; } data[j + h] = tmp; } } h = (h - 1) / 3; // 计算出下一个h值 } } }

归并排序基本思路:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列 

时间复杂度:O(nlogn)

/** *  */package com;import java.util.Arrays;/** * @author wenb * @time 下午03:41:12 * @date 2014-10-24 */public class MergeSort {    public static void main(String[] args) {             int[] a = {
1,3,2,21,5,12,98,54}; MergeSort.sort(a, 0, a.length-1); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } public static int[] sort(int[] nums, int low, int high) { int mid = (low + high) / 2; if (low < high) { // 左边 sort(nums, low, mid); // 右边 sort(nums, mid + 1, high); // 左右归并 merge(nums, low, mid, high); } return nums; } public static void merge(int[] nums, int low, int mid, int high) { int[] temp = new int[high - low + 1]; int i = low;// 左指针 int j = mid + 1;// 右指针 int k = 0; // 把较小的数先移到新数组中 while (i <= mid && j <= high) { if (nums[i] < nums[j]) { temp[k++] = nums[i++]; } else { temp[k++] = nums[j++]; } } // 把左边剩余的数移入数组 while (i <= mid) { temp[k++] = nums[i++]; } // 把右边边剩余的数移入数组 while (j <= high) { temp[k++] = nums[j++]; } // 把新数组中的数覆盖nums数组 for (int k2 = 0; k2 < temp.length; k2++) { nums[k2 + low] = temp[k2]; } } }

 

 

转载于:https://www.cnblogs.com/hardwork/p/4048203.html

你可能感兴趣的文章
郑杨:上交所设立科创板工作正稳步推进 “沪伦通”年内启动
查看>>
苏索轰世界波 米兰2:0热那亚重返意甲前四
查看>>
中瑞创新产业中心在杭揭牌 千万补助推动科技创新交流
查看>>
辽宁经济走出最困难时期 GDP增速稳中有进
查看>>
程序员牛人专访0012期|陪伴是对开发最长情的信任
查看>>
芝加哥略影 邂逅芝加哥!
查看>>
体素科技:2018年,算法驱动下的医学影像分析进展
查看>>
算法:什么是LRU算法?
查看>>
Vue 折腾记 - (8) 写一个挺靠谱的多地区选择组件
查看>>
VS Code折腾记 - (3) 多图解VSCode基础功能
查看>>
flex实现左右布局中按钮溢出隐藏效果
查看>>
Redux 高级 -- 源码分析
查看>>
看看“疫苗查询”小程序有温度的代码
查看>>
再不懂区块链,你就OUT了!
查看>>
[译] Javascript开销(Cost)
查看>>
教你玩转自定义View—手撸一个倒计时控件如此简单
查看>>
『翻译』Node.js 调试
查看>>
我的iOS开发之路总结(更新啦~)
查看>>
Java NIO之拥抱Path和Files
查看>>
TensorFlow引入了动态图机制Eager Execution
查看>>