利用Java语言实现八种排序算法(中
来源:互联网 发布:telnet 无法打开端口 编辑:程序博客网 时间:2024/05/22 04:50
5.简单选择排序
算法思想:假设待排序元素序列有n个,在第一趟排序过程中,从n个元素序列中选择最小的元素,并将其放在序列最前面位置。在第二趟排序中,从剩余n-1个元素中选择最小元素放在第二个位置。以此类推,直到没有待比较元素。
public void SelectSort(int[] nums){for(int i = 0;i<nums.length;i++){int min = i;for(int j = i+1;j<nums.length;j++){if(nums[j]<nums[min]){min = j;}}if(min!=i){swap(nums,i,min);}}}private void swap(int[] nums,int i,int min){int temp = nums[i];nums[i] = nums[min];nums[min] = temp;}
简单选择排序是一种不稳定的排序算法。时间复杂度是O(n2),空间复杂度为O(1)。
6.堆排序
如果任意一个顶点元素都比其孩子结点元素大或者比孩子结点元素小,则称该序列为最大堆/最小堆。根节点最大/最小。
最小/大堆用于求最小/大值,堆序列用于多次求极值的问题。在直接选择排序中,求一个序列的最小值,必须遍历该序列,在比较所有元素后才能确定最小值,时间复杂度O(n),效率低下。
如果把数据序列堆成树。约定父母结点值比孩子节点值大/小。则求最大/小值的时间复杂度为O(1)。
public static void adjustHeap(int[] nums,int i,int len){int temp,j;temp = nums[i];for(j = 2 * i;j<len;j = j*2){if(j<len && nums[j]<nums[j+1])++j;if(temp >= nums[j])break;nums[i] = nums[j];i = j;}nums[i] =temp;}public static void heapSort(int[] nums){int i;for(i = nums.length/2-1;i>=0;i--){adjustHeap(nums,i,nums.length-1);}//构建一个大顶堆for(i = nums.length-1;i>=0;i--){int temp = nums[0];nums[0] = nums[i];nums[i] = temp;adjustHeap(nums,0,i-1);//将nums中前i-1个记录重新调整为大顶堆}}
7.归并排序
待排序元素序列被划分为若干个子序列,每个子序列是有序的。通过将有序子序列合并为整体有序的序列就是归并排序。其中,最常见的是2路归并排序。
private void merge(int[] nums,int[] tar,int begin1,int begin2,int n){//begin1和begin2分别是nums前后两段的起始位置,归并到目标数组tar,这两段长度都是nint i = begin1;int j = begin2;int k = begin1;//目标数组tar从k开始计数,k=begin1while(i<begin1+n && j<begin2+n && j<nums.length){if(nums[i]<nums[j]){tar[k++] = nums[i++];}else{tar[k++] = nums[j++];}}while(i<begin1+n && i<nums.length){tar[k++] = nums[i++];}while(j<begin2+n && j<nums.length){tar[k++] = nums[j++];}}private void mergepass(int[] nums,int[] tar,int n){System.out.println("子序列长度n="+n+" ");for(int i = 0;i<nums.length;i+=2*n){merge(nums,tar,i,i+n,n);}}public void mergeSort(int[] nums){int[] tar = new int[nums.length];int n = 1;while(n<nums.length){mergepass(nums, tar, n);n = n*2;if(n<nums.length){mergepass(tar,nums,n);n = n*2;}}}
阅读全文
1 0
- 利用Java语言实现八种排序算法(中
- 利用Java语言实现八种排序算法(上
- 八种排序算法-Java实现
- 八种排序算法 Java、Python、C++实现 -- 插入排序
- 八种排序算法Java实现-希尔排序
- 八种排序算法Java实现-二分插入排序
- 八种排序算法Java实现-冒泡和选择排序
- 八种排序算法Java实现-快速排序
- 八种排序算法Java实现-堆排序
- 八种排序算法java实现(1)----冒泡排序
- php实现八中排序算法
- 八种排序算法总结(Java实现)
- 常用的八种排序算法与Java代码实现
- Java常用的八种排序算法与代码实现
- 常用的八种排序算法与Java代码实现
- Java常用的八种排序算法与代码实现
- [Java]常用的八种排序算法与代码实现
- Java常用的八种排序算法与代码实现
- 处理springMVC返回json日期格式化
- PDF笔记(二):Itext 实际项目案例
- ES6 let & const
- 第十三周项目1---(5)拓扑排序算法验证
- 配置tomcat服务https协议
- 利用Java语言实现八种排序算法(中
- spring mvc 防止重复提交表单的两种方法,推荐第二种
- druid 数据库连接池
- Ehcache 通过通过程序配置
- 使用Softmax回归实现MNIST
- RTO 与 RPO
- C++ Primer温习体会
- PDF笔记(一):Itext 的基础知识
- Python字符串中常用的方法