面试中常用的六种排序算法及其Java实现
常见排序算法的时间复杂度以及稳定性:
1 public class Sort {
public static void main(String[] args){
int[] nums=new int[]{2,6,9,4,1,8,5,5,6};
//SelectSort(nums);
//BubbleSort(nums);
//InsertSort(nums);
//FastSort(nums,0,nums.length-1);
//MergeSort(nums,0,nums.length-1);
HeapSort(nums);
for(int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
}
private static void Swap(int[] nums,int i,int j){
int val=nums[i];
nums[i]=nums[j];
nums[j]=val;
}
/*
选择排序
*/
private static void SelectSort(int[] nums){
for(int i=0;i<nums.length;i++){
int index=i;
for(int j=i+1;j<nums.length;j++){
if(nums[j]<nums[index]) index=j;
}
Swap(nums,i,index);
}
}
/*冒泡排序*/
private static void BubbleSort(int[] nums){
for(int i=nums.length-1;i>0;i--){ //外层循环控制排序的轮数
boolean isSorted=true;
for(int j=0;j<i;j++){ //内层循环每次将未排序序列中最大的数冒泡到最后端
if(nums[j]>nums[j+1]){
Swap(nums,j,j+1);
isSorted=false;
}
}
if(isSorted) break;
}
}
/*插入排序*/
private static void InsertSort(int[] nums){
for(int i=1;i<nums.length;i++){
int val=nums[i];
int j=i;
while(j>0&&nums[j-1]>val){
nums[j]=nums[j-1];
j--;
}
nums[j]=val;
}
}
/*快速排序*/
private static void FastSort(int[] nums,int start,int end){
if(start>=end) return ;
int val=nums[start];
int i=start,j=end;
while(i<j){
while(i<j&&nums[j]>val){
j--;
}
if(i<j){
nums[i]=nums[j];
i++;
}
while(i<j&&nums[i]<val){
i++;
}
if(i<j){
nums[j]=nums[i];
j--;
}
}
nums[i]=val;
FastSort(nums,start,i-1);
FastSort(nums,i+1,end);
}
/*归并排序*/
private static void MergeSort(int[] nums,int start,int end){
if(start>=end||nums.length==1) return ;
int mid=start+(end-start)/2;
MergeSort(nums,start,mid);
MergeSort(nums,mid+1,end);
Merge(nums,start,mid,end);
}
private static void Merge(int[] nums,int start,int mid,int end){
int len1=mid-start+1,len2=end-mid;
int[] left=new int[len1];
int[] right=new int[len2];
int i=0,j=0,k=0;
for(k=start;i<len1;i++,k++){
left[i]=nums[k];
}
for(k=mid+1;j<len2;j++,k++){
right[j]=nums[k];
}
for(k=start,i=0,j=0;i<len1&&j<len2;k++){
if(left[i]<=right[j]){
nums[k]=left[i];
i++;
}else{
nums[k]=right[j];
j++;
}
}
if(i<len1){
while(i<len1){
nums[k++]=left[i++];
}
}else{
while(j<len2){
nums[k++]=right[j++];
}
}
}
/*堆排序*/
private static void HeapSort(int[] nums){
//1.建立堆
for(int i=nums.length/2-1;i>=0;i--){
adjustHeap(nums,i,nums.length-1);
}
//2.调整堆
for(int i=nums.length-1;i>0;i--){
int val=nums[i];
nums[i]=nums[0];
nums[0]=val;
adjustHeap(nums,0,i-1);
}
}
private static void adjustHeap(int[] nums,int pos,int end){
int temp=nums[pos];
int child=0;
for(;2*pos+1<=end;pos=child){
child=2*pos+1;
if(child<end&&nums[child+1]>nums[child]){
child++;
}
if(nums[child]>temp){
nums[pos]=nums[child];
}
else break;
}
nums[child]=temp;
}
}
面试中常用的六种排序算法及其Java实现的更多相关文章
- 面试中常用排序算法实现(Java)
当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果.所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容: 排 ...
- 数据结构笔记01:编程面试过程中常见的10大算法(java)
以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: ...
- Java中的数据结构及排序算法
(明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模 ...
- 【CSWS2014 Summer School】互联网广告中的匹配和排序算法-蒋龙(下)
[CSWS2014 Summer School]互联网广告中的匹配和排序算法-蒋龙(上) Fig19,用到了矩阵,这个我没有听太明白,蒋博士也没有详细说明.不过可以明确的一点就是,我们常说的K-mea ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 7种基本排序算法的Java实现
7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- 几大排序算法的Java实现(原创)
几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...
随机推荐
- [leetcode] 19. Remove Nth Node From End of List (Medium)
原题链接 删除单向链表的倒数第n个结点. 思路: 用两个索引一前一后,同时遍历,当后一个索引值为null时,此时前一个索引表示的节点即为要删除的节点. Runtime: 13 ms, faster t ...
- React躬行记(10)——高阶组件
高阶组件(High Order Component,简称HOC)不是一个真的组件,而是一个没有副作用的纯函数,以组件作为参数,返回一个功能增强的新组件,在很多第三方库(例如Redux.Relay等)中 ...
- java中代码的注释和快捷
添加必要的注释,对一个有责任心.有道德模范的前端必须具备的好习惯, 可以大大提高代码的可维护性.可读性. java代码注释快捷键:ctrl+shift+/首先熟悉一下html.css.js的注释的写法 ...
- TypeError: unbound method
调用类报错,具体如下 TypeError: unbound method submit() must be called with jinjin instance as first argument ...
- Ubuntu 16.04 LTS设置屏幕分辨率并永久保存所设置的分辨率
一.问题: 1.新装完Ubuntu 16.04 LTS后,进入系统打开命令行窗口,界面的分辨率显示是最小的: 2.进入System settings-->Displays 设置屏幕分辨率 显示& ...
- Drools规则引擎-如果判断某个对象中的集合是否包含指定的值
规则引擎集合相关处理 在实际生产过程中,有很多关于集合的处理场景,比如一个Fact对象中包含有一个集合,而需要判断该集合是否包含某个值.而Drools规则引擎也提供了多种处理方式,比如通过from.c ...
- 基于zookeeper集群的云平台-配置中心的功能设计
最近准备找工作面试,就研究了下基于zookeeper集群的配置中心. 下面是自己设想的关于开源的基于zookeeper集群的云平台-配置中心的功能设计.大家觉得哪里有问题,请提出宝贵的意见和建议,谢谢 ...
- MySQL中一些关于索引的知识点
什么是索引 索引是一种数据结构,其作用就是用来提高数据查询效率.比较常用的比喻就是将其类比为书籍的目录.通过目录可以精确的找到某一章节的内容所在页. 在数据量较小的时候使用索引其实也没有什么意义,即使 ...
- spring boot中的声明式事务管理及编程式事务管理
这几天在做一个功能,具体的情况是这样的: 项目中原有的几个功能模块中有数据上报的功能,现在需要在这几个功能模块的上报之后生成一条消息记录,然后入库,在写个接口供前台来拉取消息记录. 看到这个需求,首先 ...
- Task CancellationTokenSource和Task.WhenAll的应用
Task是.net4.0推出的异步编程类,与ThreadPool.QueneUserWorkItem方法类似的是,Task也是使用线程池来工作的.但Task比起这个QueneUserWorkItem的 ...
