【每日一道算法题】排序算法(冒泡,快排)

140 阅读3分钟

给定一个数组,请你编写一个函数,返回该数组排序后的形式。

冒泡排序

1.将第一个元素与与第二哥元素进行比较,大者后移(换位)
2.再将第二个元素和第三个元素比较,同上
3.直到最大的元素移到末尾
4.再对剩下的n-1个元素按上诉规则排序
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型一维数组 待排序的数组
     * @return int整型一维数组
     */
     if(arr.length==0||arr.length==1){
           return arr;
       }
        for(int i =0;i<arr.length;i++){
            for(int j=0;j<arr.length-i-1;j++){
                if(arr[j]>arr[j+1]){
                    //交换位置
                    int tem =arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tem;
                }
            }
        }
        return arr;
    }
}
  • 时间复杂度

    若原数组本身就是有序的(这是最好情况),仅需n-1次比较就可完成,时间复杂度为O(n)

    若是倒序,比较次数为 n-1+n-2+...+1=n(n-1)/2,交换次数和比较次数等值。所以,其时间复杂度为O(n2)

  • 空间复杂度:O(1)

快速排序

1.在数组中任意取一个元素作为基准元素(一般选第一个,最好随机选)
2.对待排序的元素进行分区,大于的放在右边,小于的放在左边
3.对两个分区的元素重复以上步骤

基准元素不固定位置解法

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型一维数组 待排序的数组
     * @return int整型一维数组
     */
    public int[] MySort (int[] arr) {
       quickSort(arr,0,arr.length-1);
        return arr;
    }
    public void quickSort(int[] arr,int left,int right){
        if(left<right){
            //分割点
            int point =getPoint(arr,left,right);
            //递归对左半部分进行排序
            quickSort(arr,left,point-1);
            //递归对右半部分进行排序
            quickSort(arr,point+1,right);
        }
    }
    public int getPoint(int[] arr,int left,int right){
        int start =arr[left];
        while(left<right){
            //从前往后找第一个小于基准元素的元素
            while(left<right&&arr[right]>start){
                right--;
            }
            //将这个比基准元素小的元素换到前半部分
            swap(arr,left,right);
            //在从前往后找第一个大于基准元素的元素
            while(left<right&&arr[left]>arr[right]){
                left++;
            }
            //将这个比基准元素大的元素换到后半部分
            swap(arr,left,right);
           
        }
         //返回基准元素所在位置
         return start;
    }
    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

基准位置固定解法

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型一维数组 待排序的数组
     * @return int整型一维数组
     */
    public int[] MySort (int[] arr) {
        quickSort( arr,0,arr.length-1);
        return arr;
    }
    public void quickSort(int[] arr,int start,int end){
        if(start<end){
            int key =arr[start];
            int i=start;
            for(int j=start+1;j<=end;j++){
                if(key>arr[j]){
                    //先挪前后的位置
                    swap(arr,j,++i);
                }
            }
            //基准元素放到指定位置
            arr[start]=arr[i];
            arr[i]=key;
            quickSort(arr,start,i-1);
            quickSort(arr,i+1,end);
        }
        
    }
    public void swap(int[] arr,int i,int j){
        int tem =arr[i];
        arr[i]=arr[j];
        arr[j]=tem;
    }
}
  • 时间复杂度 最优的情况下,复杂度为O(nlogn) 最坏的情况下,复杂度为O(n2)

  • 空间复杂度 最优 O(logn) 最坏 O(n)