JAVA中 常用七大排序算法

本文详细介绍了冒泡排序、简单选择排序、直接插入排序、希尔排序、堆排序、归并排序及快速排序等七大经典排序算法。每种算法均附有通俗易懂的解释和示例代码,帮助读者理解其工作原理、时间复杂度及应用场景。

一、冒泡排序(Bubble Sort)

冒泡排序:一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。稳定排序算法时间复杂度 O(n2),里层循环每趟比较第 j 项和第 j+1项,如果前项大于后项,则发生交换。缺点是每次比较后都可能发生交换,交换次数太多了,值从小到大。
通俗概述:依次比较相邻两关键字,如果反序则立即发生交换,如果正序则继续比较下一个相邻项,双重嵌套循环实现


在这里插入图片描述

参考代码:

package edu.tyut;

import java.util.Arrays;

/**
 * 冒泡排序:利用双重循环,如果前一个数比后一个数大,则发生交换,每次比较都发生交换
   优化版:添加flag标记,循环外定义flag标记为true,进入循环后flag设为false,
  若一次循环后发生了交换则将flag设为ture,进入下次循环;若整次循环只发生比较未发生交换,则说明数组已经有序,后续循环比较则不必要了,减少比较次数,提升性能
 */
public class BubbleSort {
   
   
    public static void bubbleSort(int[] arrs) {
   
   
        int temp = 0;
     boolean flag=true;//用flag作标记,当没有发生交换的时候,说明数组已经是有序的了。
        for (int i = 0; i < arrs.length - 1&&flag; i++) {
   
   
         flag=false;//flag标记初始化为false;
            for (int j = 0; j < arrs.length - i - 1; j++) {
   
   
                //判断当前项是否大于后一项
                if (arrs[j] > arrs[j + 1]) {
   
   //是,则发生交换
                    temp = arrs[j];
                    arrs[j] = arrs[j + 1];
                    arrs[j + 1] = temp;
                    flag=true;//发生交换flag标记设为true
                }
            }
        }
    }
    public static void main(String[] args) {
   
   
        int[] arr=new int[]{
   
   2,6,5,4,2,4,6,9,7};
        System.out.println(Arrays.toString(arr));
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

二、简单选择排序(Simple Selection Sort)

选择排序有:简单选择排序、树形选择排序、堆排序简单选择排序:就是通过n-1次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和i(1<=i<=n)个记录交换值时间复杂度
O(n2),在冒泡排序的基础上,只不过每次比较后,将保存最小值的索引指向小值,在一次循环结束时,将最小值与循环首项发生交换。整体分为已排序和未排序两部分,值从小到大。


简单选择排序
注意区别:冒泡排序跟直接选择排序都是依次比较相邻的记录,但是冒泡排序是一有反序立即交换,而直接插入排序则是出现反序将最小值记录下来,最后再发生交换。

在这里插入图片描述

参考代码:

package edu.tyut;

import java.util.Arrays;

/**
 * 简单选择排序:在待排序中找出最小值,然后放到已排序的末尾
 *          利用双重for循环,找出最小值,再发生一次交换
 */
public class SelectionSort {
   
   
    //需要遍历获得最小值的次数
    //要注意一点,当要排序N个数,已经经过N-1次遍历后,已经是有序数列
    public static void selectSort(int[] arrs) {
   
   
        for (int i = 0; i < arrs.length - 1; i++) {
   
   
            int temp=0;
            int index=i;//用来保存最小的索引,初始指向当前第i项
            //从未排序数中找出最小值,这里最大索引应该是数组最后一位即length-1
            for (int j = i+1; j <arrs.length; j++) {
   
   
                //如果后面的值比索引值还小,则将索引指向最小值
                if (arrs[j]<arrs[index]){
   
   
                    index=j;
                }
            }
            //已经找到最小值,然后将最小值放到已排序的末尾
            temp=arrs[i];
            arrs[i]=arrs[index];
            arrs[index]=temp;
        }
    }

    public static void main(String[] args) {
   
   
        int[] arrs=new int[]{
   
   2,6,8,99,4,46,4,5
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小郭.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值