总结一下常用的排序算法

78 阅读1分钟

总结一下常用的排序算法

选择排序

选择排序是一种非常直观的排序,他的原理是首先在未排序的序列中找到最大或最小的元素放到序列的第一个位置,然后在剩余的未排序序列中找到最大或最小的元素,放到已排序序列的末尾。以此类推,直到所有的元素都排序完成。时间复杂度为O(n)=n²
public void selectSort(int[] list){
    for(int i=0;i<list.length;i++){
        int index=i;
        for(int j=i;j<list.length;j++){
            if(list[j]<list[i]){
                index=j;
            }
            int temp=list[index];
            list[index]=list[i];
            list[i]=temp;
        }
    }
}

冒泡排序

冒泡排序是一种简单的排序算法。它重复地走访过要排序的序列,一次比较两个元素,如果它们的顺序错误就把他们交换过来。走访序列的工作是重复地进行直到没有再需要交换,也就是说该序列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

问题:冒泡排序解决当目标对象是已经排序好的数据 也需要进行多次遍历

解决:可以使用标识量的方法进行标识

public void bubbleSort(int[] array){
    int t=0;
    for(int i=0;i<array.length-1;i++){
        int flag=0;
        for(int j=0;j<array.length-1-i;j++){
            if(array[j]>array[j+1]){
                t=array[j];
                array[j]=array[j+1];
                array[j+1]=t;
                flag++;
            }
        }
        if(flag==0){
            //表示已经有序
            return;
        }
    }
}

插入排序

插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
public int[] insertSort(int[] array){
	//对arr进行拷贝,不改变参数内容
    int[] arr=Arrays.copyOf(array,array.length);
     // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
    for(int i=1;i<arr.length;i++){
          // 记录要插入的数据
        int tmp=arr[i];
         // 从已经排序的序列最右边的开始比较,找到比其小的数
        int j=i;
        while(j>0 && tmp<arr[j-1]){
            arr[j]=arr[j-1];
            j--;
        }
        // 存在比其小的数,插入
        if(j!=1){
            arr[j]=tmp;
        }
    }
    return arr;
}

快速排序

public int[] quickSort(int[] array){
    int[] arr=Arrays.copyOf(array,array.length);
    return sort(int[] arr,0,array.length-1);
}

private int[] sort(int[] arr,int left,int right){
    if(left<right){
        int partitionIndex=partition(arr,left,right);
        sort(arr,left,partitionIndex-1);
        sort(arr,partitionIndex-1,right);
    }
    return arr;
}

private int partition(int[] arr,int left,int right){
    //设定基准值(pivot)
    int pivot=left;
    int index=pivot+1;
    for(int i=index;i<=right;i++){
        if(arr[i]<arr[pivot]){
            swap(arr,i,index);
            index++;
        }
    }
    swap(arr,pivot,index-1);
    return index -1;
}

private void swap(int[] arr,int i,int j){
    int temp=arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
}