面试中常用的六种排序算法及其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)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...
随机推荐
- 学习16内容# 1.自定义模块 # 2.time # 3.datetime # 4.random
模块的定义与分类 模块是什么? 这几天,我们进入模块的学习.在学习模块之前,我们首先要知道,什么是模块? 一个函数封装一个功能,你使用的软件可能就是由n多个函数组成的(先不考虑面向对象).比如 ...
- C#的DateTime得到特定日期
//指定时间 DateTime dt = new DateTime(2016, 6, 1); //当前时间 DateTime dt = DateTime.Now; //本周周一 DateTime st ...
- phpcms V9 常用的调用标签
本文介绍phpcms v9中模板标签使用说明. >>调用根目录下phpcms\template\content\header文件 {template "content" ...
- sqlserver清除日志
在一次处理数据库日志已满的过程中,发现有的时候数据库日志不能清除,经实验,可以通过以下方式来完成. 使用exec sp_cycle_errorlog 来清除sql系统本身的临时日志. dump tra ...
- JS面向对象编程(三):非构造函数的继承
一.什么是"非构造函数"的继承? 现在有一个对象,叫"中国人". var Chinese = { ...
- vuex的实现
源代码可以查看我的github: https://github.com/Jasonwang911/TryHardEveryDay/tree/master/Vuex/vuex-resouce 欢迎s ...
- 【iOS】NSLog 打印 BOOL 类型值
这个问题以前没在意,刚偶然打印,发现有些问题,上网查了下,发现是这么搞的: NSLog(@"%@", isEqual?@"YES":@"NO" ...
- OI/ACM最全卡常大招
NO.10: 循环展开: 在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(蛤?这是个什么原理,算了,反正写了没坏处就这么写吧) NO.9: 特殊运算优化:(或许这真的没用) 取 ...
- Linux基础管道管理
一.I/O重定向 标准输入,标准输出,标准错误 file descriptors (FD, 文件描述符或Process I/O channels); 进程使用文件描述符来管理打开的文件 [root@l ...
- 前端本地proxy跨域代理配置
等了好久的接口,总算拿到了,结果却发现用本地localhost:9712去请求接口的时候,出现了跨域错误,而这个时候我们就需要进行下跨域配置了. 首先,找到项目中名为webpack.config.js ...
