• java面试中常用的排序算法


    一、冒泡排序

    1. package sort.bubble;  
    2. import java.util.Random;  
    3. /** 
    4.  * 依次比较相邻的两个数,将小数放在前面,大数放在后面 
    5.  * 冒泡排序,具有稳定性 
    6.  * 时间复杂度为O(n^2) 
    7.  * 不及堆排序,快速排序O(nlogn,底数为2) 
    8.  * @author liangge 
    9.  * 
    10.  */  
    11. public class Main {  
    12.     public static void main(String[] args) {  
    13.         Random ran = new Random();  
    14.         int[] sort = new int[10];  
    15.         for(int i = 0 ; i < 10 ; i++){  
    16.             sort[i] = ran.nextInt(50);  
    17.         }  
    18.         System.out.print("排序前的数组为");  
    19.         for(int i : sort){  
    20.             System.out.print(i+" ");  
    21.         }  
    22.         buddleSort(sort);  
    23.         System.out.println();  
    24.         System.out.print("排序后的数组为");  
    25.         for(int i : sort){  
    26.             System.out.print(i+" ");  
    27.         }  
    28.     }  
    29.       
    30.     /** 
    31.      * 冒泡排序 
    32.      * @param sort 
    33.      */  
    34.     private static void buddleSort(int[] sort){  
    35.         for(int i=1;i<sort.length;i++){  
    36.             for(int j=0;j<sort.length-i;j++){  
    37.                 if(sort[j]>sort[j+1]){  
    38.                     int temp = sort[j+1];  
    39.                     sort[j+1] = sort[j];  
    40.                     sort[j] = temp;  
    41.                 }  
    42.             }  
    43.         }  
    44.     }  
    45. }  

    二、选择排序

    1. package sort.select;  
    2. import java.util.Random;  
    3. /** 
    4.  * 选择排序 
    5.  * 每一趟从待排序的数据元素中选出最小(或最大)的一个元素, 
    6.  * 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。  
    7.  * 选择排序是不稳定的排序方法。 
    8.  * @author liangge 
    9.  *  
    10.  */  
    11. public class Main {  
    12.     public static void main(String[] args) {  
    13.         Random ran = new Random();  
    14.         int[] sort = new int[10];  
    15.         for (int i = 0; i < 10; i++) {  
    16.             sort[i] = ran.nextInt(50);  
    17.         }  
    18.         System.out.print("排序前的数组为");  
    19.         for (int i : sort) {  
    20.             System.out.print(i + " ");  
    21.         }  
    22.         selectSort(sort);  
    23.         System.out.println();  
    24.         System.out.print("排序后的数组为");  
    25.         for (int i : sort) {  
    26.             System.out.print(i + " ");  
    27.         }  
    28.     }  
    29.     /** 
    30.      * 选择排序 
    31.      * @param sort 
    32.      */  
    33.     private static void selectSort(int[] sort){  
    34.         for(int i =0;i<sort.length-1;i++){  
    35.             for(int j = i+1;j<sort.length;j++){  
    36.                 if(sort[j]<sort[i]){  
    37.                     int temp = sort[j];  
    38.                     sort[j] = sort[i];  
    39.                     sort[i] = temp;  
    40.                 }  
    41.             }  
    42.         }  
    43.     }  
    44. }  

    三、快速排序

    1. package sort.quick;  
    2. /** 
    3.  * 快速排序 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小, 
    4.  * 然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行,以此达到整个数据变成有序序列。 
    5.  * @author liangge 
    6.  *  
    7.  */  
    8. public class Main {  
    9.     public static void main(String[] args) {  
    10.         int[] sort = { 54, 31, 89, 33, 66, 12, 68, 20 };  
    11.         System.out.print("排序前的数组为:");  
    12.         for (int data : sort) {  
    13.             System.out.print(data + " ");  
    14.         }  
    15.         System.out.println();  
    16.         quickSort(sort, 0, sort.length - 1);  
    17.         System.out.print("排序后的数组为:");  
    18.         for (int data : sort) {  
    19.             System.out.print(data + " ");  
    20.         }  
    21.     }  
    22.     /** 
    23.      * 快速排序 
    24.      * @param sort 要排序的数组 
    25.      * @param start 排序的开始座标 
    26.      * @param end 排序的结束座标 
    27.      */  
    28.     public static void quickSort(int[] sort, int start, int end) {  
    29.         // 设置关键数据key为要排序数组的第一个元素,  
    30.         // 即第一趟排序后,key右边的数全部比key大,key左边的数全部比key小  
    31.         int key = sort[start];  
    32.         // 设置数组左边的索引,往右移动判断比key大的数  
    33.         int i = start;  
    34.         // 设置数组右边的索引,往左移动判断比key小的数  
    35.         int j = end;  
    36.         // 如果左边索引比右边索引小,则还有数据没有排序  
    37.         while (i < j) {  
    38.             while (sort[j] > key && j > start) {  
    39.                 j--;  
    40.             }  
    41.             while (sort[i] < key && i < end) {  
    42.                 i++;  
    43.             }  
    44.             if (i < j) {  
    45.                 int temp = sort[i];  
    46.                 sort[i] = sort[j];  
    47.                 sort[j] = temp;  
    48.             }  
    49.         }  
    50.         // 如果左边索引比右边索引要大,说明第一次排序完成,将sort[j]与key对换,  
    51.         // 即保持了key左边的数比key小,key右边的数比key大  
    52.         if (i > j) {  
    53.             int temp = sort[j];  
    54.             sort[j] = sort[start];  
    55.             sort[start] = temp;  
    56.         }  
    57.         //递归调用  
    58.         if (j > start && j < end) {  
    59.             quickSort(sort, start, j - 1);  
    60.             quickSort(sort, j + 1, end);  
    61.         }  
    62.     }  
    63. }  
    1. /** 
    2.     * 快速排序 
    3.     *  
    4.     * @param a 
    5.     * @param low 
    6.     * @param high 
    7.     *            voidTest 
    8.     */  
    9.    public static void kuaisuSort(int[] a, int low, int high)  
    10.    {  
    11.        if (low >= high)  
    12.        {  
    13.            return;  
    14.        }  
    15.        if ((high - low) == 1)  
    16.        {  
    17.            if (a[low] > a[high])  
    18.            {  
    19.                swap(a, low, high);  
    20.                return;  
    21.            }  
    22.        }  
    23.        int key = a[low];  
    24.        int left = low + 1;  
    25.        int right = high;  
    26.        while (left < right)  
    27.        {  
    28.            while (left < right && left <= high)// 左边向右  
    29.            {  
    30.                if (a[left] >= key)  
    31.                {  
    32.                    break;  
    33.                }  
    34.                left++;  
    35.            }  
    36.            while (right >= left && right > low)  
    37.            {  
    38.                if (a[right] <= key)  
    39.                {  
    40.                    break;  
    41.                }  
    42.                right--;  
    43.            }  
    44.            if (left < right)  
    45.            {  
    46.                swap(a, left, right);  
    47.            }  
    48.        }  
    49.        swap(a, low, right);  
    50.        kuaisuSort(a, low, right);  
    51.        kuaisuSort(a, right + 1, high);  
    52.    }  

    四、插入排序

    1. package sort.insert;  
    2. /** 
    3.  * 直接插入排序 
    4.  * 将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据 
    5.  * 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。 
    6.  */  
    7. import java.util.Random;  
    8. public class DirectMain {  
    9.     public static void main(String[] args) {  
    10.         Random ran = new Random();  
    11.         int[] sort = new int[10];  
    12.         for (int i = 0; i < 10; i++) {  
    13.             sort[i] = ran.nextInt(50);  
    14.         }  
    15.         System.out.print("排序前的数组为");  
    16.         for (int i : sort) {  
    17.             System.out.print(i + " ");  
    18.         }  
    19.         directInsertSort(sort);  
    20.         System.out.println();  
    21.         System.out.print("排序后的数组为");  
    22.         for (int i : sort) {  
    23.             System.out.print(i + " ");  
    24.         }  
    25.     }  
    26.     /** 
    27.      * 直接插入排序 
    28.      *  
    29.      * @param sort 
    30.      */  
    31.     private static void directInsertSort(int[] sort) {  
    32.         for (int i = 1; i < sort.length; i++) {  
    33.             int index = i - 1;  
    34.             int temp = sort[i];  
    35.             while (index >= 0 && sort[index] > temp) {  
    36.                 sort[index + 1] = sort[index];  
    37.                 index--;  
    38.             }  
    39.             sort[index + 1] = temp;  
    40.         }  
    41.     }  
    42. }  

    顺便添加一份,差不多的

    1. public static void charuSort(int[] a)  
    2.     {  
    3.         int len = a.length;  
    4.         for (int i = 1; i < len; i++)  
    5.         {  
    6.             int j;  
    7.             int temp = a[i];  
    8.             for (j = i; j > 0; j--)//遍历i之前的数字  
    9.             {  
    10.                 //如果之前的数字大于后面的数字,则把大的值赋到后面  
    11.                 if (a[j - 1] > temp)  
    12.                 {  
    13.                     a[j] = a[j - 1];  
    14.                 } else  
    15.                 {  
    16.                     break;  
    17.                 }  
    18.             }  
    19.             a[j] = temp;  
    20.         }  
    21.     }  

    把上面整合起来的一份写法:

    1. /** 
    2.  * 插入排序: 
    3.  *  
    4.  */  
    5. public class InsertSort {  
    6.     public void sort(int[] data) {  
    7.         for (int i = 1; i < data.length; i++) {  
    8.             for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {  
    9.                 swap(data, j, j - 1);  
    10.             }  
    11.         }  
    12.     }  
    13.       
    14.     private void swap(int[] data, int i, int j) {  
    15.         int temp = data[i];  
    16.         data[i] = data[j];  
    17.         data[j] = temp;  
    18.     }  
    19. }  

    五、顺便贴个二分搜索法

    1. package search.binary;  
    2. public class Main {  
    3.     public static void main(String[] args) {  
    4.         int[] sort = {1,2,3,4,5,6,7,8,9,10};  
    5.         int mask = binarySearch(sort,6);  
    6.         System.out.println(mask);  
    7.           
    8.     }  
    9.       
    10.       
    11.     /** 
    12.      * 二分搜索法,返回座标,不存在返回-1 
    13.      * @param sort 
    14.      * @return 
    15.      */  
    16.     private static int binarySearch(int[] sort,int data){  
    17.         if(data<sort[0] || data>sort[sort.length-1]){  
    18.             return -1;  
    19.         }  
    20.         int begin = 0;  
    21.         int end = sort.length;  
    22.         int mid = (begin+end)/2;  
    23.         while(begin <= end){  
    24.             mid = (begin+end)/2;  
    25.             if(data > sort[mid]){  
    26.                 begin = mid + 1;  
    27.             }else if(data < sort[mid]){  
    28.                 end = mid - 1;  
    29.             }else{  
    30.                 return mid;  
    31.             }  
    32.         }  
    33.         return -1;  
    34.           
    35.     }  
    36. }  
  • 相关阅读:
    Java跨语言调用,使用JNA访问Java外部接口
    Docker下搭建Jenkins构建环境
    Elasticsearch方案选型必须了解的10件事!
    Elasticsearch Top10 监控指标
    Elasticsearch删除操作详解
    Elasticsearch索引生命周期管理探索
    论Elasticsearch数据建模的重要性
    Elasticsearch的ETL利器——Ingest节点
    Elasticsearch基础但非常有用的功能之二:模板
    Elasticsearch基础但非常有用的功能之一:别名
  • 原文地址:https://www.cnblogs.com/eaglepan/p/4614876.html
Copyright © 2020-2023  润新知