【Java基础】各种排序算法

一、冒泡排序(时间复杂度O(n的平方))

原理:如果有n个数,那么外层标记变量从0-n-1,内层变量循环变量从n-1~0,共执行(n-1)+(n-2)+……+2+1=(n-1+1)*(n-1)/2=n*(n-1)/2次,

//从大到小冒泡排序
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
//        int []data = {9,3,6,21,2,1,34,8,2,3};
        int n;
        Scanner cin = new Scanner(System.in);
        n = cin.nextInt();
        int []data = new int[n];
        for(int i=0;i<n;i++)
            data[i] = cin.nextInt();
        for(int i=0;i<data.length-1;i++){
            for(int j=0;j<data.length-1-i;j++)
                if(data[j]<data[j+1]){
                    int t       = data[j];
                    data[j]     = data[j+1];
                    data[j+1]   = t;
                }
        }
        for(int v:data){
            System.out.println(v+" ");
        }
    }
}

二、快速排序(时间复杂度O(nlogn))具体可以参考https://blog.csdn.net/lzc4869/article/details/80279032这篇博客的内容,快速排序的主要思想是,随机找一个数为基准数用于比较(代码中是找每段的第一个数),小的放在基准数的左边,大的放在基准数的右边,再分治继续比较。

现在有一组数据4、8、6、9、7、1、3、2、5。

一开始以第一个数4作为基准数,先用一个指针从最后一个数往左找第一个比基准数4小的数字,找到了2,再用一个指针从第一个数往右找第一个比基准数4大的数字,找到了8;然后交换8和2的位置,得到:

4、2、6、9、7、1、3、8、5

交换操作完成后,继续移动两个指针,右指针找到了3,左指针找到了6,交换两数位置得:

4、2、3、9、7、1、6、8、5

交换操作完成后,继续移动两个指针,右指针找到了1,左指针找到了9,交换两数位置得:

4、2、3、1、7、9、6、8、5

这时,右指针不能移到左指针的左边因此只能移动1的位置,到左指针移动时,此时,左右指针重合,将基准元素4与指针重合元素1交换位置得:

扫描二维码关注公众号,回复: 11019754 查看本文章

1、2、3、4、7、9、6、8、5

接着,将数据以基准元素分成1、2、3和7、9、6、8、5左右两部分,分别对左右两部分进行上述的以基准元素排序的操作。以右半部分7、9、6、8、5为例,以7为基准元素,左右两个指针开始操作。

右指针找到5,左指针找到9,交换得:

7、5、6、8、9

操作后,右指针往左移到6的位置,左指针继续往右移动到6的位置,左右指针重合,交换基准元素7和重合位置的6,得

6、5、7、8、9

接着,以基准元素7为基准,将这组数分成左右两部分6、5和8、9,以此类推。

得出结果:1、2、3、4、5、6、7、8、9

import java.util.Scanner;

public class Main {

    public static void QS(int []arr,int startIndex,int endIndex){
        if(startIndex>=endIndex)
            return;
        //获取基准元素
        int jzIndex = getjz(arr,startIndex,endIndex);
        //对基准元素左边进行排序
        QS(arr,startIndex,jzIndex-1);
        //对基准元素右边进行排序
        QS(arr,jzIndex+1,endIndex);
    }

    public static int getjz(int []arr,int startIndex,int endIndex){
        int jz = arr[startIndex];
        int left = startIndex;
        int right = endIndex;
        while(left!=right){
            //right指针从右往左找比基准元素小的元素
            while((left<right) && arr[right]>jz)
                right--;
            //left指针从左往右找比基准元素大的元素
            while((left<right) && arr[left]<=jz)
                left++;
            //交换两个指针指向的元素
            if(left<right) {
                int t       = arr[left];
                arr[left]   = arr[right];
                arr[right]  = t;
            }
        }
        //left和right重合后,重合点元素和基准元素交换位置
        arr[startIndex] = arr[left];
        arr[left]=jz;

        return left;
    }

    public static void main(String[] args) {
//        int []data = {9,3,6,21,2,1,34,8,2,3};
        int n;
        Scanner cin = new Scanner(System.in);
        n = cin.nextInt();
        int []data = new int[n];
        for(int i=0;i<n;i++)
            data[i] = cin.nextInt();

        QS(data,0,data.length-1);

        for(int v:data){
            System.out.println(v+" ");
        }
    }
}

三、堆排序(时间复杂度是nlogn)参考博客链接:https://blog.csdn.net/u013384984/article/details/79496052

发布了54 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/baidu_35800355/article/details/103688831
今日推荐