常见排序算法总结

拼搏现实的明天。 2022-12-02 14:00 307阅读 0赞
  1. 冒泡排序

    /* 重复地走访要排序的元素,一次比较相邻两个元素,如果他们是逆序就把他们调换过来,直到没有元素再需要交换,排序完成。 @param nums */

    1. public static void bubbleSort(int[] nums){
    2. int len = nums.length;
    3. boolean flag = false;
    4. for(int i=0;i<len;i++){
    5. flag = false;
    6. for(int j =1;j<len-i;j++){
    7. if(nums[j-1] > nums[j]){
    8. int tmp = nums[j-1];
    9. nums[j-1]= nums[j];
    10. nums[j] = tmp;
    11. }
    12. }
    13. if(flag){
    14. break;
    15. }
    16. }
    17. }
  2. 选择排序

    /* 选择排序类似于冒泡排序,选择排序是首先在未排序的序列中找到最小值(最大值),放到序列的末尾位置,然后再从剩余未排序元素中继续寻找最小(大)元素 放到已排序序列的开始,以此类推,直到所有元素均排序完毕。 @param nums */

    1. public static void selectSort(int [] nums){
    2. int len = nums.length;
    3. int maxIndex=0;
    4. for(int i=len-1;i>=0;i--){
    5. maxIndex = 0;
    6. for(int j=0;j<=i;j++){
    7. if(nums[j]>nums[maxIndex]){
    8. maxIndex = j;
    9. }
    10. }
    11. int tmp = nums[i];
    12. nums[i] = nums[maxIndex];
    13. nums[maxIndex] = tmp;
    14. }
    15. }
  3. 插入排序

    /* 首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。 时间复杂度:O(n^2),最优时间复杂度:O(n^2),平均时间复杂度:O(n^2) @param nums /

    1. public static void insertionSort(int [] nums){
    2. int len = nums.length;
    3. int tmp;
    4. int j;
    5. for(int i=1;i<len;i++){
    6. tmp = nums[i];
    7. for( j=i;j>0 && nums[j-1] > tmp;j--){
    8. nums[j] = nums[j-1];
    9. }
    10. nums[j] = tmp;
    11. }
    12. }
  4. 快速排序

    /* 从数列中挑出一个元素,称为”基准”(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 @param nums @param l @param r /

    1. public static void quickSort(int[] nums,int l,int r){
    2. if(l<r){
    3. int i,j,x;
    4. i = l;
    5. j = r;
    6. x= nums[i];
    7. while (i<j){
    8. while (i<j&&nums[j]>x);{
    9. j--;
    10. }
    11. if(i<j){
    12. nums[i++] = nums[j];
    13. }
    14. while (i<j && nums[i]<x){
    15. i++;
    16. }
    17. if(i<j){
    18. nums[j--] = nums[i];
    19. }
    20. }
    21. nums[i] = x;
    22. quickSort(nums,l,i-1);
    23. quickSort(nums,i+1,r);
    24. }
    25. }
  5. 堆排序

    /* 创建最大堆(Build_Max_Heap):将堆所有数据重新排序 堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算 /
    public static void headSort(int[] nums){

    1. for(int i = nums.length/2;i>=0;i--){
    2. heapAdjust(nums,i,nums.length);
    3. }
    4. for(int i=nums.length-1,temp=0;i>0;i--){
    5. temp = nums[i];
    6. nums[i] = nums[0];
    7. nums[0] = temp;
    8. heapAdjust(nums,0,i);
    9. }
    10. }
    11. private static void heapAdjust(int[] nums, int parent, int len) {
    12. int temp = nums[parent];
    13. int lChild = 2*parent+1;
    14. while (lChild <len){
    15. if(lChild +1<len && nums[lChild +1 ] > nums[lChild])
    16. {
    17. lChild ++;
    18. }
    19. if(nums[parent] > nums[lChild]){
    20. break;
    21. }
    22. nums[parent] = nums[lChild];
    23. parent = lChild;
    24. lChild = 2*lChild+1;
    25. }
    26. nums[parent] = temp;
    27. }

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读

    相关 7种常见排序算法总结

    7种常见排序算法总结 排序算法总结 常见算法时间复杂度比较 冒泡排序 简介与工作原理: 简介:是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元

    相关 常见排序算法总结

    排序算法经过了很长时间的演变,产生了很多种不同的方法。对于初学者来说,对它们进行整理便于理解记忆显得很重要。每种算法都有它特定的使用场合,很难通用。因此,我们很有必要对所有常

    相关 算法-排序算法总结

    冒泡排序 朴素冒泡排序 反复扫描待排序序列,在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。第一趟,从第一个数据开始,比较相邻的两个数据,(以升序为例