zoukankan      html  css  js  c++  java
  • 八大排序算法 JAVA实现 亲自测试 可用!

    今天很高兴 终于系统的实现了八大排序算法!不说了 直接上代码 !代码都是自己敲的, 亲测可用没有问题!

    另:说一下什么是八大排序算法:

    插入排序

    希尔排序

    选择排序

    堆排序

    冒泡排序

    快速排序

    归并排序

    基数排序

    public class SortHandler {
        
        public static void main(String args[])
        {
            //int a[] = {13,12,5,71,2,54,9,6};  
    //        straightInsertSort(a,8);  
    //        print(a,8);
    //        shellSort(a, 8);
    //        print(a,8);
    //        simpleSelectSort(a,8);
    //        print(a,8);
    //        bubbleSort2(a, 8);
    //        print(a,8);
    //        quickSort(a,8);
    //        print(a,8);
    //        print(a,8);
    //        heapSort(a,8);
    //        print(a,8);
    //        print(a,8);
    //        mergeSort(a);
    //        print(a,8);
    //        
    //        int[] a = { 49, 38, 65, 197, 76, 213, 27, 50 };
    //        radixSort(a);
        }
        
        
    
        public static void print(int a[], int n){  
            for(int j= 0; j<n; j++){  
                System.out.print(a[j]);
                System.out.print("     ");
            }  
            System.out.println();
        }  
        
        public static void straightInsertSort(int a[], int n)
        {
            if(n <= 1)
            {
                return;
            }
            
            for(int i = 1; i < n; i++)
            {
                int x = a[i];
                int j = i -1;
                while(j >= 0 && a[j] > x)
                {
                    a[j+1] = a[j];
                    j--;
                }
                
                a[j+1] = x;
                
                print(a,8);
            }
        }
        
        public static void shellInsertSort(int a[], int n, int dk)
        {
            if(n <= 1 || dk > n)
            {
                return;
            }
            
            for(int i = dk * 2 -1; i < n; i++)
            {
                int x = a[i];
                int j = i - dk;
                while(j >= 0 && a[j] > x)
                {
                    a[j+dk] = a[j];
                    j = j - dk;
                }
                
                a[j+dk] = x;
                
                print(a,8);
            }
        }
        
        public static void shellSort(int a[], int n)
        {
            int dk = n/2;
            while(dk >= 1)
            {
                shellInsertSort(a, n, dk);
                dk = dk/2;
            }
        }
        
        public static void simpleSelectSort(int a[], int n)
        {
            int index = 0;
            for(int i = 0; i < n-1; i++)
            {
                index = i;
                for(int j = i; j < n-1; j++)
                {
                    if(a[j+1] < a[index])
                    {
                        index = j+1;
                    }
                }
                
                if(index != i)
                {
                    int temp = a[index];
                    a[index] = a[i];
                    a[i] = temp;
                }
                
                print(a,8);
            }
        }
        
        public static void heapSort(int a[], int length)
        {
            
            buildHeap(a, length);
            print(a,8);
            
            for(int i = length -1; i > 0; i --)
            {
                swap(a, 0, i);
                heapAjust(a, 0, i-1);
                print(a,8);
            }
        }
        
        public static void buildHeap(int a[], int length)
        {
            for(int i = length/2 -1; i >= 0; i --)
            {
                heapAjust(a, i, length);
            }
        }
        
        public static void heapAjust(int a[], int s, int length)
        {
            if(s < 0)
            {
                return;
            }
            
            int child = 2 * s + 1;
            while(child < length)
            {
                if(child + 1 < length && a[child] > a[child + 1])
                {
                    child ++;
                }
                if(a[child] < a[s])
                {
                    swap(a, child, s);
                    s = child;
                    child = 2*s + 1;
                }
                else
                {
                    break;
                }
            }
        }
        
        public static void bubbleSort(int a[], int n)
        {
            for(int i = 0; i < n-1; i++)
            {
                for(int j = 0; j < n-i-1; j++)
                {
                    if(a[j] > a[j+1])
                    {
                        int temp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = temp;
                    }
                }
                print(a,8);
            }
        }
        
        public static void bubbleSort2(int a[], int n)
        {
            int high, low, temp;
            high = n -1;
            low = 0;
            while(low < high)
            {
                for(int j = low; j < high; j++)
                {
                    if(a[j] > a[j+1])
                    {
                        temp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = temp;
                    }
                }
                
                for(int k = high; k > low; k--)
                {
                    if(a[k] < a[k-1])
                    {
                        temp = a[k];
                        a[k] = a[k-1];
                        a[k-1] = temp;
                    }
                }
                low ++;
                high --;
        
                print(a, 8);
            }
        }
        
        public static void swap(int a[], int i, int j)
        {
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
        
        public static int partition(int a[], int low, int high)
        {
            int pivotLoc = low;
            while(low < high)
            {
                while(a[high] > a[pivotLoc] && low < high)
                {
                    high --;
                }
                
                if(low < high)
                {
                    swap(a, pivotLoc, high);
                    pivotLoc = high;
                }
                else
                {    
                    break;
                }
                
                while(a[low] < a[pivotLoc] && low < high)
                {
                    low ++;
                }
                
                if(low < high)
                {
                    swap(a, pivotLoc, low);
                    pivotLoc = low;
                }
                else
                {
                    break;
                }
            }
            
            print(a, 8);
            
            return pivotLoc;
        }
        
        public static void quickSort(int a[], int low, int high)
        {
            if(low < high)
            {
                int pivotLoc = partition(a, low, high);
                quickSort(a, low, pivotLoc - 1);
                quickSort(a, pivotLoc + 1, high);
            }
        }
        
        public static void quickSort(int a[], int length)
        {
            quickSort(a, 0, length-1);
        }
    
        public static void mergeSort(int a[])
        {
            int low = 0, high = a.length - 1;
            mergeSort(a, low, high);
        }
        
        public static void mergeSort(int a[], int low, int high)
        {
            System.out.println("mergeSort-- " + "low: " + low + " high: " + high);
            int mid = (low + high) / 2;
            if(low < high)
            {
                mergeSort(a, low, mid);
                mergeSort(a, mid + 1, high);
                merge(a, low, mid, high);
            }
            print(a,8);
            return;
        }
    
    
    
        private static void merge(int[] a, int low, int mid, int high) 
        {
            if(low >= high)
            {
                return;
            }
            int[] temp = new int[high - low + 1];
            
            int i=low, j=mid + 1, k=0;
            for(; i <= mid && j <= high; k++)
            {
                if(a[i] < a[j])
                {
                    temp[k] = a[i];
                    i++;
                }
                else
                {
                    temp[k] = a[j];
                    j++;
                }
            }
            
            if(i <= mid)
            {
                for(; i <= mid; i++,k++)
                {
                    temp[k] = a[i];
                }
            }
            else if(j <= high)
            {
                for(; j <= high; j++,k++)
                {
                    temp[k] = a[j];
                }
            }
            
            for(int m = 0; m < temp.length; m++)
            {
                a[m + low] = temp[m];
            }
        }
        
        public static int getMaxDigits(int a[])
        {
            //first get the max one
            int max = a[0];
            for(int i = 1; i < a.length; i++)
            {
                if(max < a[i])
                {
                    max = a[i];
                }
            }
            if(max < 0)
            {
                return -1;
            }
            
            //then get the max digits
            int digits = 0;
            while(max > 0)
            {
                digits ++;
                max /= 10;
            }
            return digits;
        }
        
        public static int getNumInPosition(int number, int digit)
        {
            for(int i = 0; i < digit; i ++)
            {
                number /= 10;
            }
            
            number %= 10;
            return number;
        }
        
        public static void radixSort(int a[])
        {
            int length = a.length;
            int digits = getMaxDigits(a);
            int array[][] = new int[10][a.length + 1];
            for(int i = 0; i < 10; i++)
            {
                //the first element stores the column count; 
                //instantiate
                   array[i][0] = 0;  
            }
            
            print(a, 8);
            
            for(int i = 0; i < digits; i++)
            {
                for(int j = 0; j < length; j++)
                {
                    int row = getNumInPosition(a[j], i);
                    int col = ++array[row][0];
                    array[row][col] = a[j];
                }
                
                for(int row = 0, m = 0; row < 10; row++)
                {
                    int cols = array[row][0];
                    for(int col = 1; col <= cols; col++)
                    {
                        a[m++] = array[row][col];
                    }
                    
                    //reinitialize
                    array[row][0] = 0;
                }
                
                print(a, 8);
            }
        }
    
        
    }
  • 相关阅读:
    mysql查询重复
    JS全局屏蔽回车事件
    java判断某个字符串包含某个字符串的个数
    给Eclipse提速的7个技巧(转)
    Mysql中将查询出来的多列的值用逗号拼接
    模仿淘宝手机号码输入框
    浏览器的默认样式
    GUBE---一丝
    学习CSS布局
    CSS 居中大全
  • 原文地址:https://www.cnblogs.com/bolddream/p/8_sort_algorithm.html
Copyright © 2011-2022 走看看