public class Sort {
    
    //交换两个数
    private void swap(int[] arr, int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    //普通版冒泡排序,时间复杂度为O(n^2),稳定的排序算法
    public void bubbleSort(int[] arr){
        for(int i=0;i<arr.length-1;i++){
            for(int j=arr.length-2;j>=i;j--){
                if(arr[j] > arr[j+1])
                    swap(arr, j, j+1);
            }
        }        
    }
    
    //改进版的冒泡排序
    public void bubble2Sort(int[] arr){
        boolean flag = true;
        for(int i=0;i<arr.length-1;i++){
            flag = false;
            for(int j=arr.length-2;j>=i;j--){
                if(arr[j] > arr[j+1]){
                    swap(arr, j, j+1);
                    flag = true;
                }
            }
        }
    }
    
    //简单选择排序,时间复杂度为O(n^2),稳定的排序算法,性能上优于冒泡,移动次数少,最多移动n-1次
    public void selectSort(int[] arr){
        int min;
        for(int i=0;i<arr.length-1;i++){
            min = i;
            for(int j=i+1;j<arr.length;j++){
                if(arr[min] > arr[j])
                    min = j;
            }
            if(min != i)
                swap(arr,i,min);
        }
    }
    
    //直接插入排序,稳定的排序算法,比较、移动的时间复杂度为O(n^2)
    public void insertSort(int[] arr){
        for(int i=1;i<arr.length;i++){
            int temp = arr[i];
            int j;
            for(j=i-1;j>=0&&arr[j]>temp;j--)
                arr[j+1] = arr[j];
            arr[j+1] = temp;
        }
    }
    
    //双点直接插入排序,稳定的排序算法,不是从开始进行的排序
    public void insertSort2(int[] arr,int left, int right){
        for(int i=left;++left<=right;i=++left){
            int a1 = arr[i];
            int a2 = arr[left];
            if(a1<a2){
                a2 = a1;
                a1 = arr[left];
            }
            while(a1 < arr[--i]){
                arr[i+2] = arr[i];
            }
            arr[++i + 1] = a1;
            while(a2 < arr[--i]){
                arr[i+1] = arr[i];
            }
            arr[i+1] = a2;
        }
            int last = arr[right];
            while(last < arr[--right])
                arr[right+1] = arr[right];
            arr[right+1] = last;
    }
    
    //希尔排序,不是稳定的排序算法,是对插入排序的升级版,最好可以达到O(n^(3/2)),不好可以是O(n^2)
    public void shellSort(int[] arr){
        for(int gap=arr.length/2;gap>0;gap /= 2){
            for(int i=0;i<gap;i++){
                for(int j=i+gap;j<arr.length;j += gap){
                    if(arr[j]<arr[j-gap]){
                        int temp = arr[j];
                        int k = j - gap;
                        while(k>=0 && arr[k]>temp){
                            arr[k+gap] = arr[k];
                            k -= gap;
                        }
                        arr[k+gap] = temp;
                    }
                }
            }
        }
    }
    
    //堆排序,时间复杂度为O(nlogn),不适合待排列个数较少的情况
    public void heapSortAsc(int[] arr){
        for(int i=arr.length/2-1;i>=0;i--){
            heapAdjust(arr,i,arr.length-1);
        }
        for(int i=arr.length-1;i>0;i--){
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            heapAdjust(arr,0,i-1);
        }
    }
    
    //建堆与调整堆的过程
    private void heapAdjust(int[] arr, int start, int end){
        int c = start;
        int lChild = 2 * c + 1;
        int temp = arr[c];
        for(; lChild <= end; c = lChild, lChild = 2 * lChild + 1){
            if(lChild < end && arr[lChild] < arr[lChild + 1])
                lChild++;
            if(arr[lChild] < temp){
                break;
            }    
            else{
                arr[c] = arr[lChild];
                arr[lChild] = temp;
            }
        }
    }
    
    //归并排序,稳定的排序方法,比较占内存,时间复杂度为O(nlogn)
    //归并排序分为两个部分,分解与合并,从上往下的排序
    public void mergeSortUp2Down(int[] arr, int start, int end){
        if(arr == null || start >= end)
            return;
        int mid = (start + end) / 2;
        mergeSortUp2Down(arr,start,mid);
        mergeSortUp2Down(arr, mid+1, end);
        
        merge(arr,start,mid,end);
    }
    //归并排序的合并部分
    public void merge(int[] arr, int start, int mid, int end){
        int i = start;
        int j = mid + 1;
        int k = 0;
        int[] temp = new int[end-start+1];
        while(i<=mid && j <= end){
            if(arr[i] <= arr[j])
                temp[k++] = arr[i++];
            else
                temp[k++] = arr[j++];
        }
        while(i <= mid)
            temp[k++] = arr[i++];
        while(j <= end)
            temp[k++] = arr[j++];
        for(i=0;i<k;i++){
            arr[start+i] = temp[i];
        }
        
    }
    
    //从下往上的排序,
    public void mergeSortDown2Up(int[] arr){
        if(arr == null)
            return;
        for(int i=1;i<arr.length;i *= 2)
            mergeGroups(arr, arr.length,i);
    }
    
    //对数组进行若干次排序
    public void mergeGroups(int[] arr, int len, int gap){
        int i;
        for(i=0;i+2*gap-1<len;i = i+2*gap){
            merge(arr,i,i+gap-1,i+2*gap-1);
        }
        if(i+gap-1<len-1)
            merge(arr,i,i+gap-1,len-1);
    }
    
    //快速排序,不稳定的排序算法,时间复杂度为O(nlogn)
    public void quickSort(int[] arr, int low, int high){
        int pivot;
        if(low < high){
            pivot = partition(arr,low,high);
            quickSort(arr,low,pivot-1);
            quickSort(arr,pivot+1,high);
        }
    }
    
    //快速排序,进行位置交换
    private int partition(int[] arr, int low, int high){
        int pivot = arr[low];
        while(low < high){
            while(low < high && arr[high] >= pivot)
                high--;
            swap(arr,low,high);
            while(low < high && arr[low] <= pivot)
                low++;    
            swap(arr,low,high);
        }
        return low;    
    }
    
    //双基准的快速排序算法    
    private void quickSort2(int[] arr, int lowIndex, int highIndex) {
      if(lowIndex >= highIndex) return;
      int pivot1 = arr[lowIndex];
      int pivot2 = arr[highIndex];
      if(pivot1 > pivot2){
          arr[lowIndex] = pivot2;
          arr[highIndex] = pivot1;
          pivot1 = arr[lowIndex];
          pivot2 = arr[highIndex];
      }else if(pivot1 == pivot2){
          while(pivot1 == pivot2 && lowIndex <= highIndex){
              pivot1 = arr[++lowIndex];
          }
      }
      int i = lowIndex + 1;
      int lt = lowIndex + 1;
      int gt = highIndex - 1;
      while(i<=gt){
          if(pivot1 > arr[i]){
              swap(arr,lt++,i++);
          }else if(pivot2 < arr[i]){
              swap(arr,i,gt--);
          }else{
              i++;
          }
      }
      swap(arr,lowIndex,--lt);
      swap(arr,highIndex,++gt);
      quickSort2(arr,lowIndex,lt-1);
      quickSort2(arr,lt+1,gt-1);
      quickSort2(arr,gt+1,highIndex);
  }
    
    //桶排序
    public void bucketSort(int[] arr, int max){
        if(arr == null || max < 1) return ;
        int[] buckets = new int[max];
        for(int i=0;i<arr.length;i++)
            buckets[arr[i]]++;
        for(int i=0, j=0;i<max;i++)
            while((buckets[i]--)>0)
                arr[j++] = i;
    }
    
    //计数排序,稳定的排序算法,桶排序另一种,时间复杂度为O(n)
    public void countSort(int[] arr, int max){
        int[] result = new int[arr.length];
        int[] temp = new int[max];
        for(int i=0;i<arr.length;i++){
            temp[arr[i]]++;
        }
        for(int i=1;i<temp.length;i++){
            temp[i] += temp[i-1];
        }
        for(int i=0;i<temp.length;i++)
            temp[i] -= 1;
        for(int i=arr.length-1;i>=0;i--){
            result[temp[arr[i]]--] = arr[i];
        }
        System.arraycopy(result, 0, arr, 0, arr.length);       
    }
    //基数排序,桶排序的升级版,利用计数排序来做
    public void radixSort(int[] arr, int max){
        for(int exp=1;max/exp>0;exp *= 10){
            countSort1(arr,exp);
        }
    }
    //基数排序调用计数排序
    public void countSort1(int[] arr, int exp){
        int[] temp = new int[10];
        int[] result = new int[arr.length];
        for(int i=0;i<arr.length;i++)
            temp[arr[i]]++;
        for(int i=1;i<10;i++)
            temp[i] += temp[i-1];
        for(int i=0;i<10;i++)
            temp[i]--;
        for(int i=arr.length-1;i>=0;i--)
            result[temp[arr[i]]--] = arr[i];
        System.arraycopy(result, 0, arr, 0, arr.length);
    }
   
    
    public static void main(String[] args) {
        Sort sort = new Sort();
        int[] arr = {1,6,3,5,3,2,4,5,1,6};
        sort.radixSort(arr,7);
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i] + " ");
        }
    }
}

java 实现多种排序的更多相关文章

  1. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  2. Java实现常见排序算法

    常见的排序算法有冒泡排序.选择排序.插入排序.堆排序.归并排序.快速排序.希尔排序.基数排序.计数排序,下面通过Java实现这些排序 1.冒泡排序 package com.buaa; import j ...

  3. Comparable与Comparator,java中的排序与比较

    1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...

  4. Java之List排序出错

    Java之List排序出错 Bound mismatch: The generic method sort(List<T>) of type Collections is not appl ...

  5. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  6. java过滤器(过滤器排序)

    java过滤器(过滤器排序) 定义过滤器顺序是很简单的:匹配请求的过滤器将按照它们出现在部署描述符或者编程式配置中的顺序添加到过滤器链中(记住,如果同时再部署描述符或者编程式配置中设置了一些过滤器,那 ...

  7. java实现各种排序算法

    java实现各种排序算法 import java.util.Arrays; public class SomeSort { public static void main(String[] args) ...

  8. java中多种方式读文件

    转自:http://www.jb51.net/article/16396.htm java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内 ...

  9. ElasticSearch6.0 Java API 使用 排序,分组 ,创建索引,添加索引数据,打分等(一)

    ElasticSearch6.0  Java API  使用     排序,分组 ,创建索引,添加索引数据,打分等 如果此文章对你有帮助,请关注一下哦 1.1 搭建maven 工程  创建web工程 ...

随机推荐

  1. CentOS iSCSI客户端使用配置

    配置步骤: 1.查看安装是否安装iSCSI驱动 rpm -qa|grep iscsi 2.查看yum安装源 yum list |grep iscsi 3.安装iscsi驱动 yum install i ...

  2. Java语言基础(二)

    Java语言基础(二) 一.变量续 (1).变量有明确的类型 (2).变量必须有声明,初始化以后才能使用 (3).变量有作用域,离开作用域后自动回收 变量作用域在块内有效 (4).在同一定义域中变量不 ...

  3. 导出到excel

    /// <summary> /// 导出 /// </summary> /// <param name="table">数据表</para ...

  4. web前端:js

    内嵌样式<script></script> alert(“123”)弹出对话框 document.write(“test”) 引入方式 <title></ti ...

  5. hive hbase pig 区别

    参考文档http://www.linuxidc.com/Linux/2014-03/98978.htm

  6. MVC ViewEngine视图引擎解读及autofac的IOC运用实践

    MVC 三大特色  Model.View.Control ,这次咱们讲视图引擎ViewEngine 1.首先看看IViewEngine接口的定义 namespace System.Web.Mvc { ...

  7. Visual Studio中Js使用智能感知

    使用了第三方的JS库或框架,在VS中编写JS代码,发现真是个悲剧,完全只能手打,智能感知没了,这不符合VS的一贯做风只要在写代码的JS文件加上以下代码,就可以有智能感知了 ///<referen ...

  8. jquery 银行卡号验证

    具体参考:https://github.com/jondavidjohn/payform 插件js: jquery.payform.js 具体操作 alert($.payform.validateCa ...

  9. 微软企业库Microsoft Enterprise Library的相关文章链接

    微软企业库4.1学习笔记 http://blog.csdn.net/anyqu/article/category/1228691/3 黄聪:Enterprise Library 5.0 系列教程 ww ...

  10. wordpress 当前栏目名,当前栏目的分类名

    wordpress在设计主题和做模板时经常会用到调用当前分类栏目名称,常见的有当前栏目页.文章页,详情代码如下: 1.分类名称与链接 <?php the_category(); ?> 2. ...