• 常用的排序算法


    搞了这么久,终于把几种常用的排序算法搞清楚了

    时间复杂度为O(n ^ 2)的三个

    直接插入排序,选择排序,冒泡排序

    时间复杂度为O(N * logN)的排序算法

    快速排序,归并排序,希尔排序,堆排序

    归并排序空间复杂度为O(n)

    其他空间复杂度均为O(1)

    直接插入排序

     1 import com.gxf.util.Util;
     2 
     3 /**
     4  * 直接插入排序
     5  * @author GXF
     6  *
     7  */
     8 public class InsertSort {
     9 
    10     public static void main(String[] args) {
    11         int array[] = {32, 1, 34, 54, 5, 6};
    12         
    13         Util.showInArray(array);
    14         
    15         InsertSort insertSort = new InsertSort();
    16         insertSort.insertSort(array);
    17         
    18         Util.showInArray(array);
    19     }
    20     
    21     public void insertSort(int array[]){
    22         if(array == null || array.length == 0)
    23             return;
    24         
    25         for(int i = 1; i < array.length; i++){
    26             int temp = array[i];
    27             int j = i;
    28             while(j >= 1 && array[j - 1] > temp)
    29             {
    30                 array[j] = array[j - 1];
    31                 j--;
    32             }//while
    33             array[j] = temp;
    34         }//for
    35     }
    36     
    37     
    38 }

    选择排序

     1 import com.gxf.util.Util;
     2 
     3 /**
     4  * 直接选择排序
     5  * @author GXF
     6  *
     7  */
     8 public class SelectSort {
     9 
    10     public static void main(String[] args) {
    11         SelectSort selectSort = new SelectSort();
    12         int array[] = {32, 1, 34, 54, 5, 6};
    13         Util.showInArray(array);
    14         selectSort.selectSort(array);
    15         Util.showInArray(array);
    16 
    17     }
    18     
    19     /**
    20      * 直接选择排序
    21      * @param array
    22      */
    23     public void selectSort(int array[]){
    24         for(int i = 0; i < array.length; i++){
    25             int min = i;
    26             for(int j = i + 1; j < array.length; j++){
    27                 if(array[j] < array[min])
    28                     min = j;
    29             }//for
    30             if(min != i){
    31                 int temp = array[i];
    32                 array[i] = array[min];
    33                 array[min] = temp;
    34             }//if
    35         }//for
    36     }
    37 }

    冒泡排序

     1 import com.gxf.util.Util;
     2 
     3 /**
     4  * 直接选择排序
     5  * @author GXF
     6  *
     7  */
     8 public class SelectSort {
     9 
    10     public static void main(String[] args) {
    11         SelectSort selectSort = new SelectSort();
    12         int array[] = {32, 1, 34, 54, 5, 6};
    13         Util.showInArray(array);
    14         selectSort.selectSort(array);
    15         Util.showInArray(array);
    16 
    17     }
    18     
    19     /**
    20      * 直接选择排序
    21      * @param array
    22      */
    23     public void selectSort(int array[]){
    24         for(int i = 0; i < array.length; i++){
    25             int min = i;
    26             for(int j = i + 1; j < array.length; j++){
    27                 if(array[j] < array[min])
    28                     min = j;
    29             }//for
    30             if(min != i){
    31                 int temp = array[i];
    32                 array[i] = array[min];
    33                 array[min] = temp;
    34             }//if
    35         }//for
    36     }
    37 }

    --------------------------------------------------我是分割线---------------------------------------------------

    快速排序

     1 /**
     2  * 快速排序
     3  * 先是一次划分
     4  * @author GXF
     5  *
     6  */
     7 public class QuickSort {
     8 
     9 
    10     public static void main(String[] args) {
    11         QuickSort quickSort = new QuickSort();
    12         int array[] = {32, 1, 34, 54, 5, 6};
    13         Util.showInArray(array);
    14         quickSort.quickSort(array, 0, array.length - 1);
    15         Util.showInArray(array);
    16 
    17     }
    18     
    19     /**
    20      * 快速排序
    21      * @param array
    22      * @param start
    23      * @param end
    24      */
    25     public void quickSort(int array[], int start, int end){
    26         if(start < end){
    27             int index = partion(array, start, end);
    28             quickSort(array, start, index - 1);
    29             quickSort(array, index + 1, end);
    30         }
    31     }
    32     
    33     /**
    34      * 一次划分
    35      * @param array
    36      * @param start
    37      * @param end
    38      * @return
    39      */
    40     public int partion(int array[], int start, int end){
    41         int key = array[start];
    42         while(start < end){
    43             while(start < end && array[end] > key)            //从后面开始扫描
    44                 end--;
    45             array[start] = array[end];
    46             while(start < end && array[start] < key)
    47                 start++;
    48             array[end] = array[start];
    49         }//while
    50         array[start] = key;
    51         
    52         return start;
    53     }
    54 
    55 }

    归并排序

     1 import com.gxf.util.Util;
     2 
     3 /**
     4  * 归并排序
     5  * 归并:递归 + 合并
     6  * 时间复杂度O(n * logn)
     7  * 空间复杂度O(N)
     8  * @author GXF
     9  *
    10  */
    11 public class MergeSort {
    12 
    13 
    14     public static void main(String[] args) {
    15         int array[] = {32, 1, 34, 54, 5, 6};
    16         MergeSort mergeSort = new MergeSort();
    17         Util.showInArray(array);
    18         mergeSort.mergeSort(array);
    19         Util.showInArray(array);
    20 
    21     }
    22     
    23     
    24     public void mergeSort(int array[]){
    25         if(array == null || array.length == 0)
    26             return;
    27         mergeSort(array, 0, array.length - 1, new int[array.length]);
    28     }
    29     
    30     /**
    31      * 归并排序
    32      * 升序排列
    33      * @param array
    34      * @param start
    35      * @param last
    36      * @param temp
    37      */
    38     private void mergeSort(int array[], int start, int last, int temp[]){
    39         if(start < last){
    40             int middle = (start + last) / 2;
    41             mergeSort(array, start, middle, temp);
    42             mergeSort(array, middle + 1, last, temp);
    43             merge(array, start, middle, last, temp);
    44         }
    45     }
    46     
    47     /**
    48      * 合并两个数组
    49      * @param array
    50      * @param start
    51      * @param middle
    52      * @param last
    53      * @param temp
    54      */
    55     public void merge(int array[], int start, int middle, int last, int temp[]){
    56         int first = start;
    57         int second = middle + 1;
    58         int k = 0;
    59         
    60         while(first <= middle && second <= last){
    61             if(array[first] < array[second])
    62                 temp[k++] = array[first++];
    63             else
    64                 temp[k++] = array[second++];
    65         }//while
    66         
    67         while(first <= middle)
    68             temp[k++] = array[first++];
    69         while(second <= last)
    70             temp[k++] = array[second++];
    71         for(int i = 0; i < k; i++)
    72             array[start + i] = temp[i];
    73     }
    74 
    75 }

    希尔排序

     1 import com.gxf.util.Util;
     2 
     3 /**
     4  * 希尔排序
     5  * 时间复杂度O(n * logn)
     6  * 空间复杂度O(1)
     7  * @author GXF
     8  *
     9  */
    10 public class ShellSort {
    11 
    12 
    13     public static void main(String[] args) {
    14         int array[] = {32, 1, 34, 54, 5, 6};
    15         ShellSort shellSort = new ShellSort();
    16         Util.showInArray(array);
    17         shellSort.shellSort(array);
    18         Util.showInArray(array);
    19 
    20     }
    21     
    22     /**
    23      * 这段代码整理的确实漂亮
    24      * @param array
    25      */
    26     public void shellSort(int array[]){
    27         if(array == null || array.length == 0)
    28             return;
    29         for(int gap = array.length / 2; gap > 0; gap /= 2){
    30             for(int i = gap; i < array.length; i++){
    31                 for(int j = i; j >= gap && array[j] < array[j - gap]; j -= gap)
    32                     swap(array, j, j - gap);
    33             }
    34         }
    35     }
    36     
    37     private void swap(int array[], int i, int j){
    38         int temp = array[i];
    39         array[i] = array[j];
    40         array[j] = temp;
    41     }
    42 
    43 }

    堆排序

     1 import com.gxf.util.Util;
     2 
     3 /**
     4  * 堆排序
     5  * 时间复杂度O(n * logn)
     6  * 空间复杂度O(1)
     7  * @author GXF
     8  *
     9  */
    10 public class HeapSort {
    11 
    12     public static void main(String[] args) {
    13         int array[] = {32, 1, 34, 54, 5, 6};
    14         HeapSort heapSort = new HeapSort();
    15         Util.showInArray(array);
    16         heapSort.heapSort(array);
    17         Util.showInArray(array);
    18 
    19     }
    20     
    21     /**
    22      * 堆排序
    23      * 升序排列
    24      * 先建立一个大根堆
    25      * 用数组最后一个元素和第一个元素交换,调整大根堆
    26      * @param array
    27      */
    28     public void heapSort(int array[]){
    29         //建堆
    30         for(int i = array.length / 2 - 1; i >= 0; i--){
    31             maxHeapFixDown(array, i, array.length);
    32         }
    33         //调整堆
    34         for(int i = array.length - 1; i >= 0; i--){
    35             swap(array, 0, i);
    36             maxHeapFixDown(array, 0, i);
    37         }
    38     }
    39     
    40     /**
    41      * 对大根堆中,i节点进行向下调整
    42      * @param array
    43      * @param i
    44      */
    45     private void maxHeapFixDown(int array[], int i, int n){
    46         int temp = array[i];
    47         int j = 2 * i + 1;
    48         while(j < n && i < n){
    49             //选出子节点中最大的
    50             if(j + 1 < n && array[j] < array[j + 1])
    51                 j = j + 1;
    52             if(array[j] < temp)
    53                 break;
    54             //子节点中最大的向上移动
    55             array[i] = array[j];
    56             i = j;
    57             j = 2 * i + 1;
    58         }//while
    59         array[i] = temp;
    60     }
    61     
    62     private void swap(int array[], int i, int j){
    63         int temp = array[i];
    64         array[i] = array[j];
    65         array[j] = temp;
    66     }
    67 }
  • 相关阅读:
    SA练习题总结-篇一
    树上距离(树形DP)
    Codeforces Round #633(Div.2) E. Perfect Triples
    Codeforces Round #633 (Div. 2) D.Edge Weight Assignment
    问题 B: FZB(树形DP+边记忆化)
    【Matlab】自学笔记——基础知识篇
    【Python科学计算】Numpy——ndarry
    退役总结
    [树的遍历]树的遍历(PTA)
    [stl]集合相似度(PTA)
  • 原文地址:https://www.cnblogs.com/luckygxf/p/4647771.html
Copyright © 2020-2023  润新知