面试中常用的六种排序算法及其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)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...
随机推荐
- Java 常见面试题整理
操作系统 说一下线程和进程,它们的区别 同步和异步的区别 阻塞和非阻塞的区别 操作系统中死锁的四个必要条件 mmap和普通文件读写的区别,mmap的注意点 CPU密集型和IO密集型的区别 Linux ...
- 《VR入门系列教程》之20---使用Oculus移动端SDK
使用Oculus移动端SDK 在基于安卓系统的GearVR上开发应用需要用到Oculus的移动端SDK,下面的网址可以下载SDK:http://developer.oculus.com ...
- WebGL中深度碰撞方法总结
z-fighting问题是三维渲染中常见的问题,本文根据实际工作中遇到的一些场景,进行了系统的总结 一个实际工作中的问题 当两个面离得太近就会发生深度碰撞问题,比如: 遇到深度检测问题,最重要的是先搞 ...
- [PXE] Linux(centos6)中PXE 服务器搭建,PXE安装、启动及PXE理论详解
[PXE] Linux(centos6)中PXE 服务器搭建,PXE安装.启动及PXE理论详解 本篇blog主要讲述了[PXE] linux(centos)PXE无盘服务器搭建,安装,启动及pxe协议 ...
- 腾讯云centos7 从零搭建laravel项目
目标,访问网站出现: -----------------------分割线---------------------------------------- 一.Laravel Homestead 环境 ...
- Linux基础之快照克隆、Xshell优化、Linux历史
今天主要分享4个Linux基础知识,第一个知识是虚拟机快照,第二个是虚拟机克隆,第三个是优化Xshell,第四个是简述Linux历史. 先分享第一个知识——虚拟机快照. 1.4)虚拟机快照 虚拟机快照 ...
- MYSQL 时间轴数据 获取同一天数据的前3条
创建表数据 CREATE TABLE `praise_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `pic_id` va ...
- 第四章-使用本机文件对话框和帮助进程间沟通 | Electron实战
本章主要内容: 使用Electron的dialog模块实现一个本机打开文件对话框 促进主进程和渲染器进程之间的通信 将功能从主进程暴露给渲染器进程 使用Electron的remote模块从主进程导入功 ...
- Linux ln 命令
Linux 中的文件分为 Hard Link 和 Symbolic Link 两种.Hard Link 文件又被称为硬链接文件.实体链接文件,Symbolic Link 文件则常被称为符号链接.软链接 ...
- ubuntu中设置python默认版本
看/usr/bin中的Python文件,发现该文件是python2.7的链接文件 于是直接删掉这个软链接,然后重新创建python2.6的链接文件: 1 rm /usr/bin/python 2 ln ...
