面试中常用的六种排序算法及其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)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...
随机推荐
- C#3.0新增功能03 隐式类型本地变量
连载目录 [已更新最新开发文章,点击查看详细] 从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var. 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但 ...
- SQL server 2014使用导出数据为Excel
1.打开SQL server 2014,连接至数据库引擎 2.在要导出的数据库上右击,选择"任务->导出数据" 3.数据源选择"SQL Server Native ...
- JVM(一):久识你名,初居我心
聊聊JVM JVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别. JVM可以说和我们是老朋友 ...
- net core 序列化与反序列化与遇到的几个坑
之前在C#里面序列化直接引入命名空间后使用JavaScriptSerializer jss = new JavaScriptSerializer();就可以用, 而net core里面不这样用了,我们 ...
- python requests、xpath爬虫增加博客访问量
这是一个分析IP代理网站,通过代理网站提供的ip去访问CSDN博客,达到以不同ip访同一博客的目的,以娱乐为主,大家可以去玩一下. 首先,准备工作,设置User-Agent: #1.headers h ...
- 遇见Python集合类型
Python目前有两种内置集合类型,set和frozenset. Ⅰ.两者区别 set是可变的,没有哈希值,其内容可以使用add()和remove()这样的方法来改变,所以不能被用作字典的键或其他集合 ...
- 前端js性能优化的要点
1 尽量少使用全局查找,比如全局变量,如果要多次使用,可以将全局变量存为局部变量再使用 eg:function(){ var body=document.body; alert(body): body ...
- RabbitMQ搭建单机及集群
1,基本环境配置 hosts 文件 免密登录 2,访问官网 https://www.rabbitmq.com/download.html 3, 4,安装依赖 yum -y install make g ...
- 【JDK】JDK源码分析-TreeMap(2)
前文「JDK源码分析-TreeMap(1)」分析了 TreeMap 的一些方法,本文分析其中的增删方法.这也是红黑树插入和删除节点的操作,由于相对复杂,因此单独进行分析. 插入操作 该操作其实就是红黑 ...
- Android Studio 设置/更改 SDK 路径
网上看到有人说需要重启 Android Studio,感觉麻烦,就自己试了试其他方法,果然还是有的! 很简单,只需打开 File 菜单下的 Project Structure 就可以设置了,如图所示: