算法的六种常见排序

本文详细介绍了六种常见的排序算法:冒泡排序、插入排序、快速排序、希尔排序、归并排序。通过算法思想和示例,解释了每种排序的工作原理和特点。冒泡排序通过相邻元素比较交换实现,插入排序使用链表结构,快速排序采用分治策略,希尔排序改进插入排序,归并排序则通过递归合并有序子数组来完成。各种排序算法的时间复杂度和适用场景也有所不同。
摘要由CSDN通过智能技术生成

1 . 冒泡排序( Bubble Sort )

在遍历数组时判断 当前位置的 数组大小(a[ j ])是否比下一位(a[ j + 1 ])大,如果是,则将

a[ j ] 与 a[ j + 1 ]数值交换,即把大的数往后放,就像是冒泡一样,大的数一直后移,直到数组有序。

在此进行了优化,添加了flag判断本次循环是否进行了交换,如未进行交换则说明排序完毕,跳出循环,减少了可能出现的已经排好序但循环没有结束,继续运行的情况;

当前数组 :6    1    5    3    4

内循环第一遍                   1    6    5    3    4

内循环第一遍                   1    5    6    3    4

内循环第一遍                   1    5    3    4    6

下一次内循环

内循环第一遍                   1    3    5    4    6

内循环第二遍                   1    3    4    5    6

内循环第三遍                   1    3    4    5    6

此时未进行交换,flag = 0,跳出循环,无需再进行下一次内循环

冒泡排序的时间复杂度是O(n^2)的

import java.util.Scanner;

public class BubbleSort {
    public static void main(String[] args) {
        int n;
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }
        bubble(a, n);
    }

    public static void bubble(int[] a, int n) {
        int x;
        int flag = 0;//这句可以不写
        x = a[0];
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (a[j] >a[j  + 1]) {
                    flag++;
                    x = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = x;
                }
            }
            if (flag == 0) {//可以不写
                break;
            } else
                flag = 0;
        }
        for (int i = 0; i < n; i++) {
            System.out.print(a[i] + " ");
        }
    }
}

2 . 插入排序 ( Insert Sort )

插入排序运用到了链表,将数据存储在链表中,我在写的时候先在头节点后插入了两个节点,这算是一个bug,不能输入两个以下的数。

在输入时,遍历链表,将新建的链表节点按顺序插入链表中:

此时链表中数值:1     2    5    6    9

新输入的值:3

遍历链表,找到第一个大于三的数,在这个数之前插入新的节点:

1    2    3    5    6    9

插入完毕

如果遍历结束没有找到比输入数值大的节点,则将新建的节点插入链表末尾

import javax.xml.soap.Node;
import java.util.*;

public class InsertSort {
    public static void main(String[]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值