JAVA实习找工作——冒泡排序、快速排序

一、冒泡排序

冒泡排序是一种基本的排序算法,主要的思想是:假如要求从小到大排序,比较相邻的元素,当左边的元素大于右边时,就交换位置。

比如一个数组:9-18-6-5-12。将这5个元素从小到大排序,思路如下

(1)比较第1位和第2位,不用交换;比较第2位和第3位,交换9-6-18-5-12;比较第3位和第4位,交换9-6-5-18-12;比较第4位和第5位,交换9-6-5-12-18。此时,最大的18已经在最后一位了

(2)比较第1位和第2位,交换6-9-5-12-18;比较第2位和第3位,交换6-5-9-12-18;比较第3位和第4位,不用交换。此时,第二大的12在倒数第2位

(3)比较第1位和第2位,交换5-6-9-12-18;比较第2位和第3位,不要交换;此时第三大的9归位了

(4)比较第1位和第2位,不用交换。排序完毕

总结:如果对n个数进行排序,需要n-1趟才能排序结束,因为每一趟都可以将一个数归位,每一趟都是第1位开始向后比,但是不需要比到最后一位。

package com.note;

import java.util.Scanner;

public class 冒泡排序 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//表示有n个数
        int[] arr = new int[n + 1];

        //将n个数存储到arr数组中
        for (int i=1;i<=n;i++){
            arr[i] = sc.nextInt();
        }

        //冒泡排序
        for (int i=1;i<=n-1;i++){//需要进行n-1趟排序
            for (int j=1;j<=n-i;j++){//比较到n-i即可,因为每次都会排好一位
                if (arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        
        //输出排序后的数组
        for (int i=1; i<=n; i++)
            System.out.print(arr[i]+" ");
        
    }
}

代码如上,并且笔记很清楚,那么输入

5
9 18 6 5 12

后,结果如下

5 6 9 12 18 

二、快速排序

快速排序算法是经常使用的算法,但是它的理解比冒泡排序要困难的多,因为它涉及递归和分治思想,这2种思想挺难理解的,即使我是科班出身的学生我都觉得不容易,所以这里不解释这两种思想,直接解释快速排序是怎么进行的。

比如一个数组:9-18-6-5-12-8-3-7。将这8个元素从小到大排序,思路如下

(1)首先设置一个基准数,随便哪一个,就比方第一个数9。于是9就是一个基准数

(2)设置left=1指向第一个数9,right=8指向最后一个数7。

(3)先让right先向左运动,直至找到小于基准数的一个数,其实right=8时,元素为7就小于9,left向右运动,直至找到大于9的数,left=2时,元素为18就大于9。交换arr[left]和arr[right]。于是9-7-6-5-12-8-3-18。

(4)right继续向左,right=7时元素为3小于9;left继续向右,left=5时元素为12大于9;交换得9-7-6-5-3-8-12-18。

(5)right继续向左,right=6时元素为8小于9;left继续向右,left=6时,此时left和right相遇了,就要将标准数归位,就是将9和8交换得8-7-6-5-3-9-12-18。这时会发现9左边的都是小于9的,9右边的都是大于9的。

(6)将9左边的数字按照相同的办法快速排序,右边也快速排序。

package com.note;

import java.util.Scanner;

public class 快速排序 {
    private static int[] arr;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//表示有n个数
        arr = new int[n + 1];

        //将n个数存储到arr数组中
        for (int i=1;i<=n;i++){
            arr[i] = sc.nextInt();
        }

        //调用快速排序函数
        f(1,n);


        //输出排序后的数组
        for (int i=1; i<=n; i++)
            System.out.print(arr[i]+" ");
    }

    private static void f(int left, int right) {
        if (left > right)
            return;
        //设置一个基准数
        int temp = arr[left];
        //设置左右2大使者
        int i = left;
        int j = right;


        while (i != j){//当i和j没有相遇

            //j向左寻找一个小于temp的数
            while (arr[j]>=temp && i<j)
                j--;
            //i向右寻找一个大于temp的数
            while (arr[i]<=temp && i<j)
                i++;
            //找到之后交换
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }


        //i和j相遇,就将基准数归位
        arr[left] = arr[i];
        arr[i] = temp;

        f(left, i-1);//继续递归处理左边的数组
        f(i+1, right);//继续递归处理右边的数组
    }
}

输入

8
9 18 6 5 12 8 3 7

后输出

3 5 6 7 8 9 12 18 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值