• 主要排序算法的Java实现


    最近温习算法,花点时间写了点代码验证下,在这里做个存档。

      1 package com.chrischeng.hacker;
      2 
      3 import java.util.*;
      4 
      5 /**
      6  * Created by Yexin on 2016/11/4.
      7  */
      8 
      9 //Complete the code
     10 public class Solution
     11 {
     12     private final static int ARRAYSIZE = 50;
     13     private final static int ARRAYRANGE = ARRAYSIZE * 2;
     14 
     15     // 通过随机数发生器生成一个指定大小的随机数组
     16     public static int[] createArray(int size){
     17         int []retArray = new int [size];
     18         Random random = new Random();
     19         for(int i = 0;i < size;i++)
     20             retArray[i] = random.nextInt(ARRAYRANGE);
     21         return retArray;
     22     }
     23 
     24     // 打印指定数组
     25     public static void printArray(int []arr){
     26         for(int a : arr)
     27             System.out.print(a + " ");
     28         System.out.println();
     29     }
     30 
     31     // 交换数组中指定序号的元素值
     32     public static void swap(int[] arr, int i, int j ){
     33         if(i >= arr.length || j >= arr.length)
     34             return;
     35         else{
     36             int temp = arr[i];
     37             arr[i] = arr[j];
     38             arr[j] = temp;
     39         }
     40     }
     41 
     42     // 使用带有标志位的冒泡排序
     43     public static void bubbleSort(int []arr){
     44         int len = arr.length;
     45         boolean flag = false;
     46         for(int i = 0; i < len - 1; i++){
     47             for(int j = i + 1; j < len;j++){
     48                 if(arr[i] > arr[j]) {
     49                     swap(arr, i, j);
     50                     flag = true;
     51                 }
     52             }
     53             if(flag == false)
     54                 break;
     55         }
     56     }
     57 
     58     // 直接插入排序
     59     public static void insertionSort(int []arr){
     60         int len = arr.length, i = 1, j;
     61         for(; i < len; i++){
     62             int temp = arr[i];
     63             if(arr[i - 1] > arr[i]){
     64                 j = i - 1;
     65                 while(j >= 0 && arr[j] > temp) {
     66                     arr[j+1] = arr[j];
     67                     j--;
     68                 }
     69                 arr[j+1] = temp;
     70             }
     71         }
     72     }
     73 
     74     // Shell排序(本质上就是分治法的直接插入排序)
     75     public static void shellSort(int []arr){
     76         int len = arr.length, gap, i, j;
     77         for(gap = len/2; gap > 0; gap /= 2){
     78             for(i = gap;i < len; i++){
     79                 if(arr[i] < arr[i -gap]){
     80                     int temp = arr[i];
     81                     j = i - gap;
     82                     while(j >= 0 && arr[j] > temp){
     83                         arr[j+gap] = arr[j];
     84                         j -= gap;
     85                     }
     86                     arr[j+gap] = temp;
     87                 }
     88             }
     89         }
     90     }
     91 
     92     // 快速排序
     93     public static void quickSort(int []arr, int l, int r){
     94         if(l < r) {
     95             int i = l, j = r, base = arr[r];
     96             while (i < j) {
     97                 // 由左至右遍历,找到第一个大于中轴的元素
     98                 while (i < j && arr[i] < base)
     99                     i++;
    100                 // 如果i和j没有交叉且找到了第一个大于中轴的元素(index为i),则将它的值存放在j的位置,而j位置的值存放在base中
    101                 if (i < j)
    102                     arr[j--] = arr[i];
    103                 // 从右到左遍历,找到第一个小于中轴的元素
    104                 while (i < j && arr[j] > base)
    105                     j--;
    106                 // 如果i和j没有交叉且找到了第一个小于中轴的元素,则将他的值存放在上一步中index-i的位置上
    107                 if (i < j)
    108                     arr[i++] = arr[j];
    109             }
    110             // 上面的遍历完成后,i左侧都是小于base的元素,右侧都是大于base的元素,base作为中值存放在index=i的位置上,并不参与下次排序
    111             arr[i] = base;
    112             // 分别对数组左右侧进行递归排序
    113             quickSort(arr,l,i-1);
    114             quickSort(arr,i+1,r);
    115         }
    116     }
    117 
    118     // 桶排序
    119     // 本质上其实就是彻底的牺牲空间换取时间的做法
    120     // 适用于数字范围在一定区间内的随机数组
    121     public static void bucketSort(int arr[]){
    122         // 此处之所以使用对象数组,是因为实际情况中存在多个同值元素存在的可能性
    123         ArrayList<Integer> buckets[] = new ArrayList[ARRAYRANGE + 1];
    124         for(int i : arr) {
    125             if (buckets[i] == null)
    126                 buckets[i] = new ArrayList<Integer>();
    127             buckets[i].add(new Integer(i));
    128         }
    129         int index = 0;
    130         for(ArrayList<Integer> al : buckets){
    131             if(null != al && al.size() > 0){
    132                 for(Integer i : al)
    133                     arr[index++] = i;
    134             }
    135         }
    136     }
    137 
    138     // 基数排序
    139     // 本质上就是按照从低位到高位的桶排序,所以无论随机数组的长度为多大,永远只需要十个桶
    140     public static void radixSort(int arr[]){
    141     }
    142 
    143     public static void main(String[] args){
    144         int [] arr = createArray(ARRAYSIZE);
    145         printArray(arr);
    146         bucketSort(arr);
    147         printArray(arr);
    148     }
    149 }
  • 相关阅读:
    股票
    使用广播信道的以太网
    CSMA/CD 3
    可赎回债券
    matlab中的knn函数
    债券 账面值
    最优化作业 共轭梯度法 matlab代码
    债券和股票 溢价公式
    债券和股票
    CSMA/CD 续
  • 原文地址:https://www.cnblogs.com/chrischeng/p/6464210.html
Copyright © 2020-2023  润新知