05、Java 数据结构:数组排序:冒泡排序、选择排序、插入排序

1 冒泡排序

1.1 思想

基本思想是对所有相邻记录的关键字值进行比效,如果是逆序,则将其交换,最终达到有序化;其处理过程为:
(1)将整个待排序的记录序列划分成有序区和无序区,初始状态有序区为空,无序区包括所有待排序的记录
(2)对无序区从前向后依次将相邻记录的关键字进行比较,若逆序将其交换,从而使得顺序记录向上”飘浮”(左移),逆序记录向下“堕落”(右移)。 每经过一趟冒泡排序,都使无序区中关键字值最大的记录进入有序区,对于由 n 个记录组成的记录序列,最多经过 n-1 趟冒泡排序,就可以将这 n 个记录重新按关键字顺序排列

##1.2 代码实现

public class BubblingSort {
    public static void main(String[] args) {
        BiblomgSortUnorderArray array = new BiblomgSortUnorderArray(10);
        //插入数据
        array.insert(11);
        array.insert(2);
        array.insert(33);
        array.insert(41);
        array.insert(1);
        //显示数据
        array.display();//11 2 33 41 1
        //冒泡排序
        array.bubling();
        array.display();//1 2 11 33 41 
    }
}
class BiblomgSortUnorderArray{//无序数组类

    private long[] array;//无序数组
    private int nElement;//数组中存在的数据个数

    //构造方法,初始化 arraySize 长度的无序数组,并初始化数据个数为 0
    public BiblomgSortUnorderArray(int arraySize){
        array = new long[arraySize];
        nElement = 0;
    }

    //插入数据:直接在数组的末尾插入数据,数据个数加一
    public void insert(long data){
        array[nElement++] = data;
    }

    //寻找数据:遍历数组,返回查找到的数据的位置索引
    public int get(long data){
        for (int i = 0;i<nElement;i++){
            if (data == array[i]){
                return i;
            }
        }
        return -1;//表示没有找到
    }

    //删除数据:先查找数据,再删除数据,再将后面的所有数据前移一个位置,最后数据个数减一
    public void delete(long data){//只会删除找到的第一个目标数组
        int index = get(data);
        if (index==-1){
            System.out.println("没有该数据");
        }else {//找到数据索引后,直接将后面数据前移覆盖,不必再刻意删除
            for (int i = index;i<nElement;i++){
                array[i] = array[i+1];
            }
            nElement--;
        }
    }

    //遍历数组:读取数组的每个数据项
    public void display(){
        for(int i = 0;i<nElement;i++){
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }

    //实现冒泡排序
    public void bubling(){
        int inner;
        int outer;
        for (outer = nElement-1;outer>0;outer--){//外层循环,从尾到头循环
            for (inner=0;inner<outer;inner++){//内层循环,从头到 outer 循环
                if (array[inner]>array[inner+1]){//如果发现前面元素比后面元素大,交换位置
                    long n = array[inner];
                    array[inner] = array[inner+1];
                    array[inner+1] = n;
                }
            }
        }
    }
}

2 选择排序

2.1 思想

如果有N个元素需要排序,那么首先从 N 个元素中找到最小的那个元素与第0位置上的元素交换,接着从剩余的 N-1 个元素中再次找到最小的那个元素和第1位置上的元素交换,依此循环

2.2 代码实现

public class SelectSort {
    public static void main(String[] args) {
        SelectSortUnorderArray array = new SelectSortUnorderArray(10);
        //插入数据
        array.insert(11);
        array.insert(2);
        array.insert(33);
        array.insert(41);
        array.insert(1);
        //显示数据
        array.display();//11 2 33 41 1
        //选择排序
        array.selectSort();
        array.display();//1 2 11 33 41
    }
}

class SelectSortUnorderArray {//无序数组类

    private long[] array;//无序数组
    private int nElement;//数组中存在的数据个数

    //构造方法,初始化 arraySize 长度的无序数组,并初始化数据个数为 0
    public SelectSortUnorderArray(int arraySize) {
        array = new long[arraySize];
        nElement = 0;
    }

    //插入数据:直接在数组的末尾插入数据,数据个数加一
    public void insert(long data) {
        array[nElement++] = data;
    }

    //寻找数据:遍历数组,返回查找到的数据的位置索引
    public int get(long data) {
        for (int i = 0; i < nElement; i++) {
            if (data == array[i]) {
                return i;
            }
        }
        return -1;//表示没有找到
    }

    //删除数据:先查找数据,再删除数据,再将后面的所有数据前移一个位置,最后数据个数减一
    public void delete(long data) {//只会删除找到的第一个目标数组
        int index = get(data);
        if (index == -1) {
            System.out.println("没有该数据");
        } else {//找到数据索引后,直接将后面数据前移覆盖,不必再刻意删除
            for (int i = index; i < nElement; i++) {
                array[i] = array[i + 1];
            }
            nElement--;
        }
    }

    //遍历数组:读取数组的每个数据项
    public void display() {
        for (int i = 0; i < nElement; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }

    //实现选择排序
    public void selectSort() {
       int inner;//内边界
       int outer;//外边界
       int min;//最小值的索引
       for(outer = 0;outer<nElement-1;outer++){//外层循环,outer从0遍历到倒数第二个元素
           min = outer;//让 min 默认等于 outer
           for (inner=outer+1;inner<nElement;inner++){//内层循环,inner 从 outer+1 遍历到最后一个元素
               if(array[min]>array[inner]){//比较大小,将最小值位置索引赋值给 min
                   min = inner;
               }
           }
           long n = array[outer];//将最小值与前面的大值进行交换
           array[outer] = array[min];
           array[min] = n;
       }
    }
}

3 插入排序

3.1 思想

对于一个无序列表,拿出一个临时变量(起始为第二个元素),将其和前面元素循环比较,如果前面的元素比临时变量大,就讲前面的元素向后移动一位,如果前面的元素比临时变量小,或者已经到达的头部第一个元素,就结束循环,然后在依此循环后面所有的元素

3.2 代码实现

public class InsertSort {
    public static void main(String[] args) {
        InsertSortUnorderArray array = new InsertSortUnorderArray(10);
        //插入数据
        array.insert(11);
        array.insert(2);
        array.insert(33);
        array.insert(41);
        array.insert(1);
        //显示数据
        array.display();//11 2 33 41 1
        //插入排序
        array.insertSort();
        array.display();//1 2 11 33 41
    }
}

class InsertSortUnorderArray {//无序数组类

    private long[] array;//无序数组
    private int nElement;//数组中存在的数据个数

    //构造方法,初始化 arraySize 长度的无序数组,并初始化数据个数为 0
    public InsertSortUnorderArray(int arraySize) {
        array = new long[arraySize];
        nElement = 0;
    }

    //插入数据:直接在数组的末尾插入数据,数据个数加一
    public void insert(long data) {
        array[nElement++] = data;
    }

    //寻找数据:遍历数组,返回查找到的数据的位置索引
    public int get(long data) {
        for (int i = 0; i < nElement; i++) {
            if (data == array[i]) {
                return i;
            }
        }
        return -1;//表示没有找到
    }

    //删除数据:先查找数据,再删除数据,再将后面的所有数据前移一个位置,最后数据个数减一
    public void delete(long data) {//只会删除找到的第一个目标数组
        int index = get(data);
        if (index == -1) {
            System.out.println("没有该数据");
        } else {//找到数据索引后,直接将后面数据前移覆盖,不必再刻意删除
            for (int i = index; i < nElement; i++) {
                array[i] = array[i + 1];
            }
            nElement--;
        }
    }

    //遍历数组:读取数组的每个数据项
    public void display() {
        for (int i = 0; i < nElement; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }

    //实现插入排序
    public void insertSort() {
        int inner;//内边界
        int outer;//外边界
        int min;//最小值的索引
        for (outer = 0; outer < nElement - 1; outer++) {//外层循环,outer从0遍历到倒数第二个元素
            min = outer;//让 min 默认等于 outer
            for (inner = outer + 1; inner < nElement; inner++) {//内层循环,inner 从 outer+1 遍历到最后一个元素
                if (array[min] > array[inner]) {//比较大小,将最小值位置索引赋值给 min
                    min = inner;
                }
            }
            long n = array[outer];//将最小值与前面的大值进行交换
            array[outer] = array[min];
            array[min] = n;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

玄天灵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值