用java实现冒泡、选择、插入以及快速排序

一、冒泡排序

所谓冒泡排序,假设一个数组中有n个数要进行排列,那么它就要进行n轮相邻两位的对比,而每一轮对比后,最大的数都会放在最右边!

package Array;

import java.util.Arrays;

public class SortDemo {
    public static void main(String[] args) {
        int[] ary = new int[]{1, 5, 7, 8, 3};
        // Arrays.sort(ary); 实现列表排序,从小到大,自带方法
        // System.out.println(Arrays.toString(ary));
        ary = Fun(ary);
        System.out.println(Arrays.toString(ary));
    }
    // 冒泡排序
    public static int[] Fun(int[] ary){
    	// 下标i来控制比较多少轮
        for(int i=0;i<ary.length;i++){
        	// 设置数组是否有序标记
        	boolean flag = false;
        	// 下标j用来控制要比较的数据,注意这里是arr.length-i-1
            for(int j=0;j<ary.length-i-1;j++){
                if(ary[j]>ary[j+1]){
                	// 如果左边比右边大,交换两数位置
                    int temp = ary[j];
                    ary[j] = ary[j+1];
                    ary[j+1] = temp;
                    flag = true;
                }
            }
            if(!flag){
				break;	// 此时数组已然有序,退出循环
			}
        }
        return ary;
    }
}
二、选择排序

每个元素都和第一位进行比较,如果左边的比右边的大,交换位置,.一轮之后,最小的在最左边,那么n-1轮之后,完成排序。

// 选择排序
public  static int[] Fun1(int[] ary){
    for(int i=0;i<ary.length-1;i++){
        for(int j=i+1;j<ary.length;j++){
            if(ary[i]>ary[j]){
                int t = ary[i];
                ary[i] = ary[j];
                ary[j] = t;
            }
        }
    }
    return ary;
}
三、插入排序

先把数组分二半,默认情况下,以左边第一个数分开。从右边按序取出一个数,和左边比,放到合适的位置,n-1轮后,完成排序。

// 插入排序
public static int[] Fun2(int[] ary){
   int j=0;	// j为左边数组下标
   for(int i=1;i<ary.length;i++){	// i为右边数组依次取出
       int temp = ary[i];
       //i是左,j是右 让小的在左边
       for(j=i-1;j>=0;j--){
           if(temp<ary[j]){
               ary[j+1] = ary[j];
               ary[j] = temp;
           }else{
               break;
           }
       }
}
四、快速排序

选一中间数,默认为数组的第一个,中间数左边的是小于中间数的数,右边是大于中间数的数,左边和右边没有排序的,只是简单的大于或小于中间数,再把左边,分二半,以一个数为中间,再左边是小,右边的大的,右边同理,一直递归下去.,直到序列有序。

package Array;

import java.util.Arrays;

public class QuickSort {
    public static void main(String[] args) {
        int[] ary = new int[]{1, -1, -5, 0, 5, 67};
        quickSort(ary, 0, ary.length-1);
        System.out.println(Arrays.toString(ary));
    }
    public static void quickSort(int[] ary, int left, int right){
        if(left>right)
        {
            return;
        }
        // 默认以第一个数为基数
        int base = ary[left];
        int i = left;
        int j = right;
        while(i!=j){
            while(ary[j]>=base && i<j){
                j--;
            }
            while(ary[i]<=base && i<j){
                i++;
            }
            // 两个循环都停止说明i和j都找到了对应的数,此时交换两数位置
            int temp = ary[i];
            ary[i] = ary[j];
            ary[j] = temp;
        }
        // 跳出循环后,说明i和j相遇了,此时交换基数和相遇位置的那个数
        ary[left] = ary[i];
        ary[i] = base;
        // 排出base左边的数
        quickSort(ary, left, i-1);
        // 排右边的数
        quickSort(ary, j+1, right);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值