1.冒泡排序

  public static void main(String[] args) {
int[] arr = {1,4,2,9,5,7,6};
System.out.println("排序前:"+Arrays.toString(arr));
bubbleSort(arr);
System.out.println("冒泡排序后:"+Arrays.toString(arr));
} static void bubbleSort(int[] arr){
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}

2.快速排序

  public static void main(String[] args) {
int[] arr = {1,4,2,9,5,7,6};
System.out.println("排序前:"+Arrays.toString(arr));
quickSort(arr,0,arr.length-1);
System.out.println("快速排序后:"+Arrays.toString(arr));
} static void quickSort(int[] arr,int left,int right){
if(left>=right) return;//如果只有一个元素,不用遍历
int i=left,j=right,temp=arr[left];
while(i<j){
while(i<j && arr[j]>=temp) j--;
arr[i]=arr[j];//遇见小的移动
while(i<j && arr[i]<=temp) i++;
arr[j]=arr[i];
}
arr[i]=temp;//i==j
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}

3.简单选择排序

  public static void main(String[] args) {
int[] arr = {1,4,2,9,5,7,6};
System.out.println("排序前:"+Arrays.toString(arr));
selectSort(arr);
System.out.println("选择排序后:"+Arrays.toString(arr));
} static void selectSort(int[] arr){
int min = 0;
for(int i=0;i<arr.length-1;i++){
min = i;
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[min])
min = j;
}
if(min!=i){
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}

4.直接插入排序

  public static void main(String[] args) {
int[] arr = {1,4,2,9,5,7,6};
System.out.println("排序前:"+Arrays.toString(arr));
shellSort(arr);
System.out.println("希尔排序后:"+Arrays.toString(arr));
} static void shellSort(int[] arr){
for(int increment=arr.length/2;increment>0;increment/=2){//增量循环变更
for(int i=increment;i<arr.length;i++){
for(int j=i-increment;j>=0;j-=increment){
if(arr[j]>arr[j+increment]){
int temp = arr[j];
arr[j] = arr[j+increment];
arr[j+increment] = temp;
}
}
}
}
}

5.希尔排序

  public static void main(String[] args) {
int[] arr = {1,4,2,9,5,7,6};
System.out.println("排序前:"+Arrays.toString(arr));
shellSort(arr);
System.out.println("希尔排序后:"+Arrays.toString(arr));
} static void shellSort(int[] arr){
for(int increment=arr.length/2;increment>0;increment/=2){//增量循环变更
for(int i=increment;i<arr.length;i++){
for(int j=i-increment;j>=0;j-=increment){
if(arr[j]>arr[j+increment]){
int temp = arr[j];
arr[j] = arr[j+increment];
arr[j+increment] = temp;
}
}
}
}
}

6.归并排序

  public static void main(String[] args) {
int[] arr = {1,4,2,9,5,7,6};
System.out.println("排序前:"+Arrays.toString(arr));
mergeSort(arr);
System.out.println("归并排序后:"+Arrays.toString(arr));
} static void mergeSort(int[] arr){
sort(arr,0,arr.length-1);
} static void sort(int[] arr,int low,int high){
int mid = (low+high)/2;
if(low<high){
sort(arr,low,mid);
sort(arr,mid+1,high);
merge(arr,low,mid,high);//归并
}
} static void merge(int[] arr,int low,int mid,int high){
int[] newArr = new int[high-low+1];
int i = low,j=mid+1,k=0;
while(i<=mid && j<=high){
if(arr[i]<arr[j]){
newArr[k++] = arr[i++];
}else{
newArr[k++] = arr[j++];
}
} //左边剩余移入数组
while(i<=mid){
newArr[k++] = arr[i++];
}
//右边剩余移入数组
while(j<=high){
newArr[k++] = arr[j++];
}
// 把新数组中的数覆盖原数组
for(k=0;k<newArr.length;k++){
arr[k+low] = newArr[k];
}
}

7.基数/桶排序

  public static void main(String[] args) {
int[] arr = {1,4,2,9,5,7,6};
System.out.println("排序前:"+Arrays.toString(arr));
radixSort(arr);
System.out.println("基数排序后:"+Arrays.toString(arr));
} static void radixSort(int[] arr){
sort(arr,0,arr.length-1,1);
} //digit元素最高位数
static void sort(int[] arr,int low,int high,int digit){
int radix = 10;//0~9 基数
int[] count = new int[radix];//确定桶中每一个基数的索引位置
int[] bucket = new int[high-low+1];//桶 用数组表示
for(int d=1;d<=digit;d++){
// 置空各个桶索引
for (int i = 0; i < radix; i++) {
count[i] = 0;
}
//统计桶数据个数
for (int i = low,j=0; i <=high; i++) {
j = getDigit(arr[i], d);
count[j]++;
}
//确定桶的右边索引
for (int i = 1; i < radix; i++) {
count[i] = count[i] + count[i - 1];
}
//数据入桶
for (int i = high,j=0; i >= low; i--) {
j = getDigit(arr[i], d);
bucket[count[j] - 1] = arr[i];
count[j]--;
}
//赋值原数组
for (int i = 0; i <= high; i++) {
arr[i+low] = bucket[i];
}
}
} //得到第几位数字
static int getDigit(int x, int d) {
return ((x / (int)Math.pow(10, d-1)) % 10);
}

8.堆排序

public static void main(String[] args) {
int[] arr = {1,4,2,9,5,7,6};
System.out.println("排序前:"+Arrays.toString(arr));
heapSort(arr);
System.out.println("堆排序后:"+Arrays.toString(arr));
} static void heapSort(int[] arr){
int len = arr.length-1;
//建立大顶堆
for(int i=len/2; i>=0; i--)
{
heapAdjust(arr,i,len);
}
//进行排序
for(int i=len; i>0; i--)
{
//最后一个元素和第一元素进行交换
int temp=arr[i];
arr[i] = arr[0];
arr[0] = temp;
//然后将剩下的无序元素继续调整为大顶堆
heapAdjust(arr,0,i-1);
} } static void heapAdjust(int[] arr,int low,int high){
int temp = arr[low];
//i结点左孩子和右孩子分别为2i+1和2i+2
for(int i=2*low+1;i<=high;i*=2){
if(i<high && arr[i]<arr[i+1]){//左右孩子比较大小
i++;
}
if(temp>arr[i])//左右孩子中最大值父亲结点比较大小
break;
arr[low]= arr[i];
low = i;
}
arr[low] = temp;
}

选择排序、快速排序、希尔排序、堆排序是不稳定的排序算法

冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法

八大排序算法java代码的更多相关文章

  1. 八大排序算法Java实现

    本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...

  2. 排序算法Java代码实现(一)—— 选择排序

    以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...

  3. 八大排序算法 JAVA实现 亲自测试 可用!

    今天很高兴 终于系统的实现了八大排序算法!不说了 直接上代码 !代码都是自己敲的, 亲测可用没有问题! 另:说一下什么是八大排序算法: 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排 ...

  4. 八大排序算法C++代码实现

    八大排序算法 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序 ...

  5. 八大排序算法Java

    目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...

  6. 排序算法Java代码实现(三)—— 插入排序 和 希尔排序

    因为希尔排序的核心思想是插入排序,所以本篇将两篇排序一起记录 本篇内容: 插入排序 希尔排序 (一)插入排序 算法思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序 ...

  7. 排序算法Java代码实现(四)—— 归并排序

    本篇内容: 归并排序 归并排序 算法思想: 将两个或两个以上的有序表合并成一个新的有序表, 即把待排序序列分成若干个子序列,每个子序列是有序的,然后在把有序子序列合并为整体有序序列. 此算法分为两步: ...

  8. 排序算法Java代码实现(六)—— 堆排序

    本片内容: 堆排序 堆排序 最大堆: 二叉堆是完全二叉树或者是近似完全二叉树, 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.(父节点大于任何一个子节点) 算法思想: 把n个元素建立最大 ...

  9. 排序算法Java代码实现(五)—— 快速排序

    本篇内容: 快速排序 快速排序 算法思想: 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序, 整个排 ...

随机推荐

  1. 转_Greenplum 数据库安装部署(生产环境)

    Greenplum 数据库安装部署(生产环境) 硬件配置: 16 台 IBM X3650, 节点配置:CPU 2 * 8core,内存 128GB,硬盘 16 * 900GB,万兆网卡. 万兆交换机. ...

  2. 图像处理之滤波---滤波在游戏中的应用boxfilter

    http://www.yxkfw.com/?p=7810 很有意思的全方位滤波应用 https://developer.nvidia.com/sites/default/files/akamai/ga ...

  3. EasyPusher手机直播编码推送之图像旋转90度后画面重复的问题

    本文转自EasyDarwin开源团队开发Holo的博客:http://blog.csdn.net/holo_easydarwin 最初在做EasyPusher手机直播的时候遇到过一个问题:手机竖屏推送 ...

  4. [Phoenix] 五、二级索引

    摘要: 目前HBASE只有基于字典序的主键索引,对于非主键过滤条件的查询都会变成扫全表操作,为了解决这个问题Phoenix引入了二级索引功能.然而此二级索引又有别于传统关系型数据库的二级索引,本文将详 ...

  5. Hadoop实战-MapReduce之WordCount(五)

    环境介绍: 主服务器ip:192.168.80.128(master)  NameNode  SecondaryNameNode ResourceManager 从服务器ip:192.168.80.1 ...

  6. 阿里云Redis开发规范(转)

    一.键值设计 1. key名设计 (1)[建议]: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video: (2)[建议]:简洁性 ...

  7. java的一个简单死锁的例子

    package com.deadlock; /* * 演示死锁:(由毕向东视频所得) * 一种解释:Thread—0拿到lock1锁,Thread—1拿到lock2锁,Thread—0想要lock2锁 ...

  8. linux杂谈(十四):ftp的企业应用级的配置(一)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/linux_player_c/article/details/24869877 1.ftp简单介绍 ( ...

  9. git (转载)

    文章转载 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的 ...

  10. Centos7利用kvm搭建Windows虚拟机

    这几天玩了一下kvm虚拟化,真的很有意思,我把这几天踩的坑,还有收获,都记录下来,作为以后的复习和检查. 首先说一下我的基本逻辑,我有一台win7的笔记本,我的底层虚拟化是使用VMWare构建的Cen ...