排序算法之冒泡,选择,插入,快速排序

数组的排序是我们在学习编程的时候常见的问题,如果想要快速的进行排序可以使用数组的工具类Arrays,它里面就有针对数组各种功能实现的方法,包括排序功能(Arrays.sort(传入的数组)),下面使用介绍不用工具类的集中算法实现数组排序功能。

1.冒泡排序:

     冒泡排序算法的原理如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

     4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 //冒泡排序
    @Test
    public void bubbleSort(){
        int[] arr=new int[]{20,44,1,6,8,2};
        for (int i=0;i<arr.length-1;i++){
            for (int j=0;j<arr.length-i-1;j++){
                if (arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        for (int i : arr) {
            System.out.print(i+" ");
        }
    }

2.选择排序:

选择排序就是不断地从未排序的元素中选择最大(或最小)的元素放入已排好序的元素集合中,直到未排序中仅剩一个元素为止 
public class SelectSort {

    public static void main(String[] args) {
        int[] arr={10,20,3,22,6,9};
        selectSort(arr);
    }

    public static void selectSort(int[] arr){
        //从无序区间不断挑出最小值,挑选n-1次
        for (int i=0;i<arr.length-1;i++){
            //i下标的左边是有序区间,右边是无序区间
            int minIndex=i;
            //找出最小值并交换位置
            for (int j=i+1;j<arr.length;j++){
                if (arr[j]<arr[minIndex]){
                    minIndex=j; //更新最小值的下标
                }
            }
            //交换最小值和无序区间的位置
            int temp=arr[minIndex];
            arr[minIndex]=arr[i];
            arr[i]=temp;
        }
        System.out.println(Arrays.toString(arr));
    }
}

3.插入排序:

所谓直接插入排序,就是把未排序的元素一个一个地插入到有序的集合中,插入时把有序集合从后向前扫一遍,找到比自己数值小或相等的位置后面插入
//插入排序
    @Test
    public void insertSort(){
        int[] arr=new int[]{20,44,1,6,8,2};
        for (int i=0;i<arr.length;i++){
            //无序需要插入的值
            int insertVal=arr[i];
            //有序列表的最后一个位置
            int insertIndex=i-1;
            //有序列表有值,无序比有序的小
            while(insertIndex>=0&&insertVal<arr[insertIndex]){
                //比过的有序列表向后挪一位
                arr[insertIndex+1]=arr[insertIndex];
                //和有序列表的下一位比较
                insertIndex--;
            }
            //比较结束,插入的值位于当前后一位
            arr[insertIndex+1]=insertVal;
        }
        for (int i : arr) {
            System.out.print(i+" ");
        }
    }

4.快速排序:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分的数据分别进行快速排序,整个排序过程可以递归进行,以此来达到整个数据变成有序序列。

  public static void quickSort(int[] arr,int left,int right){
        int l=left; //左下标
        int r=right;    //右下标
        //pivot 中轴值
        int pivot=arr[(left+right)/2];
        int temp=0; //临时变量,作为交换时使用
        //循环的目的是让比pivot值小的放在左边,大的放在右边
        while (l<r){
            //在pivot的左边找,找到大于等于pivot的值,才退出
            while (arr[l]<pivot){
                l += 1;
            }
            //在pivot的右边找,找到小于等于pivot的值,才退出
            while (arr[r]>pivot){
                r -=1;
            }
            //如果l>=r说明pivot左边的值都是小于它的,右边的值都是大于它的;
            if (l>=r){
                break;
            }

            //交换值
            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;

            //如果交换完后,发现这个 arr[l]==pivot值相等 r--,前移
            if (arr[l]==pivot){
                r -=1;
            }

            //如果交换完后,发现这个 arr[r]==pivot值相等 l++,后移
            if (arr[r]==pivot){
                l +=1;
            }
        }

        //如果l==r,必须l++,r--,否则会出现栈溢出
        if (l==r){
            l +=1;
            r -=1;
        }

        //向左递归
        if (left<r){
            quickSort(arr,left,r);
        }

        //向右递归
        if (right>l){
            quickSort(arr,l,right);
        }

    }
发布了42 篇原创文章 · 获赞 6 · 访问量 2969

猜你喜欢

转载自blog.csdn.net/qq_44666176/article/details/100099292