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. Java 单文件下载及重命名

    代码(仅供参考): /* * 另存为 */ @RequestMapping("/saveAs.do") public @ResponseBody void saveAs(Strin ...

  2. 删除我的电脑中360随身WiFi云U盘的图标

    可通过删除注册表的方法 运行-regedit 找到这个项 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\My ...

  3. Scanner中next()和nextline()读取字符串方法和区别

    在实现字符窗口的输入时,我个人更喜欢选择使用扫描器Scanner,它操作起来比较简单.在写作业的过程中,我发现用Scanner实现字符串的输入有两种方法,一种是next(),一种nextLine(), ...

  4. 文字排版--字号、颜色(font-size, color)

    可以使用下面代码设置网页中文字的字号为12像素,并把字体颜色设置为#666(灰色): body{font-size:12px;color:#666} 示例: <!DOCTYPE HTML> ...

  5. Linux下JDK环境变量配置

    JDK官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 我的下载路 ...

  6. 【算法】数组与矩阵问题——找到无序数组中最小的k个数

    /** * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) * 过程: * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 * 在堆里的k个元素中堆顶的元素是最小的k个数 ...

  7. 【转】jquery两稳定版本比较~~

    博客分类: Web前端 jquery  jquery历经了多个版本的更新,版本上的比较貌似没什么必要性,一般来说新的版本会比旧的版本各方面都略有提升,但由于新版中增加了各种新的功能,难免会引起bug的 ...

  8. 内置方法+lambda是pythonic的利器

    python可以写的非常简洁,通过使用内置的map,reduce,filter,lambda方法,非常具有文艺范. 举个例子,例如 def fromIpToNum(ipAddr):    return ...

  9. underscorejs-toArray学习

    2.23 toArray 2.23.1 语法: _.toArray(list) 2.23.2 说明: 把list(任何可以迭代的对象)转换成一个数组,在转换arguments对象时非常有用. 2.23 ...

  10. Bootstrap_表单_表单控件

    一.输入框input 单行输入框,常见的文本输入框,也就是input的type属性值为text. 在Bootstrap中使用input时也必须添加type类型,如果没有指定type类型,将无法得到正确 ...