JAVA算法—排序

这篇具有很好参考价值的文章主要介绍了JAVA算法—排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

*冒泡排序:

*选择排序:

插入排序:

快速排序:

总结:


以下全部以升序为例


*冒泡排序:

引用:

JAVA算法—排序,算法,java,排序算法

在完成升序排序时,最大的元素会经过一轮轮的遍历逐渐被交换到数列的末尾,就像气泡从水底慢慢升到水面的过程。这个过程会重复进行,直到整个序列有序,即没有更多的“气泡”需要“上浮”。

步骤(针对于升序)

  1. 从 0 索引开始向后,相邻元素两两相比(索引 0 和 1、 1 和 2 ),小的放在左,大的放在右。

如上面动图,在最大的数放置在最右边后,这样就完成了第一轮排序,这一轮中确定了最大值

  1. 在第二轮中仍然从 0 索引开始,在剩余元素中两两比较。每一轮都可以确定一个组内最大值
  2. 如果数组中有n个数据,总共我们只要执行n-1轮就可以,如针对数组{6,9,3,1}

第一轮流程:

6-9 9-3 3-1 确定了索引 3 位置上的最大值

第二轮流程:

6-9 9-3 确定了索引 2 位置上的次大值

第三轮流程:

6-9 确定了索引 1 位置上的次次大值

索引 0 显然不用再去比较,因为已经有三个数字大小关系已被确认,索引 0 就可以被默认确认。

代码演示

//1.定义数组---要求从小到大排序
int[] arr = {5, 9, 7, 3, 4};

//外循环:表示我要执行多少轮。 如果有n个数据,那么执行n - 1 轮
for (int i = 0; i < arr.length-1; i++) {
//内循环表示我们在每一轮内要做什么:从 0 索引开始向后,两两比较
//-1:为了防止arr[j + 1]索引越界
//-i:提高效率,每一轮执行的次数应该比上一轮少一次。0、1、2、3
    for (int j = 0; j < arr.length - 1-i; j++) {
        if (arr[j] > arr[j + 1]) {
            //定义临时变量交换数据
            int num = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = num;
        }
    }
}

//遍历检验
for (int i1 = 0; i1 < arr.length; i1++) {
    System.out.print(arr[i1] + " ");
}
}



控制台:

3 4 5 7 9


*选择排序:

引用:

JAVA算法—排序,算法,java,排序算法

步骤(针对于升序)

  1. 从0索引开始,将 0 索引跟后面的元素一 一比较

小的放左,大的放右

第一轮结束后,最小的数据已经确定,在最左侧。

  1. 所以第二轮直接从1索引开始跟后面的元素一 一比较

以此类推....

  1. 如果数组中有n个数据,总共我们只要执行n-1轮就可以如数组{2,7,5,4}

第一轮:

2-7 2-5 2-4

第二轮:

7-5 7-4

第三轮:

5 - 4

第四轮没必要走了,4 不可能和自己比较

int[] arr = {6, 4, 8, 9, 5};

//外循环表示要走的轮数,
/*第一轮:6和其余四个比较  第二轮:4和其余三个比较....
......第四轮:9和5比较*/
for (int i = 0; i < arr.length - 1; i++) {
//内循环:每一轮我要干什么事情:拿着i跟i后面的数据进行比较交换
    for (int j = i + 1; j < arr.length; j++) {
        if (arr[i] > arr[j]) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}
//遍历检验
for (int i1 = 0; i1 < arr.length; i1++) {
    System.out.println(arr[i1]);
}

控制台:

4 5 6 8 9


插入排序:

和打扑克牌一样,

步骤(针对升序数组):

  1. 将 0 索引的元素到 N 索引的元素看做是有序的,其后元素则看作是无序的。

JAVA算法—排序,算法,java,排序算法

  1. 遍历后面那些无序的元素,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。
  2. 每遍历并排序完一个无序元素后,有序序列就会多一个元素,无序序列就会少一个元素。
  3. 如下引用动图:

JAVA算法—排序,算法,java,排序算法

代码实现:

int[] arr = {3, 44,
             38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
//显然看得出3,44有序


//先找到无序序列的开始索引
int startInsert=-1;
for (int i = 0; i < arr.length; i++) {
    //注意这里针对的是升序
    if (arr[i]>arr[i+1]){
        startInsert=i+1;//2
        break;
    }
}

//所以说无序的开始索引是2(38)
//现在遍历无序序列
for (int i =startInsert ; i <arr.length ; i++) {
    int j=i;//第一次为2,每轮结束后都会向后移一个
    
    //这里判断条件顺序不能变
    while(j>0&&arr[j]<arr[j-1]){
        int temp=arr[j];
        arr[j]=arr[j-1];
        arr[j-1]=temp;
        j--;
    }
}

for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i]+" ");
}

控制台

2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

针对这段代码,解释下逻辑:

JAVA算法—排序,算法,java,排序算法

startInsert 已经知道是无序索引 2 了

i=2 进去,赋值给 j =2 ,j 用于与有序序列比较,while 括号内逻辑: j>0 并且,索引 2 的值小于和索引 1 的值,那么它们就交换位置, 然后 j--,索引 1 和索引 0 的值比较

JAVA算法—排序,算法,java,排序算法

之后 j 无发再--,此时有序序列为 2、 38、 44

跳出 while,i++,为 3,...以此类推


快速排序:

引用:

JAVA算法—排序,算法,java,排序算法

1. 从数列中挑出一个元素,一般都是左边第一个数字,称为 "基准数";

2. 创建两个指针,一个从前往后走,一个从后往前走。

3. 先执行后面的指针找出第一个比基准数小的数字

4. 再执行前面的指针找出第一个比基准数大的数字

JAVA算法—排序,算法,java,排序算法

5. 交换两个指针指向的数字

之后不断找,不断交换

6. 直到两个指针相遇

JAVA算法—排序,算法,java,排序算法

7. 将基准数跟指针指向位置的数字交换位置,称之为:基准数归位。

8. 第一轮结束之后,基准数左边的数字都是比基准数小的,基准数右边的数字都是比基准数大的。

9. 把基准数左边看做一个序列,把基准数右边看做一个序列,按照刚刚的规则递归排序


int[] arr = {6,1,2,7,9, 3, 4, 5,10, 8};

quickSort(arr,0,arr.length-1);//参数:数组、排序数组开始、结束索引

//遍历检验
for (int i = 0; i < arr.length; i++) {
    System.out.print    (arr[i]+" ");
}

----------------------------------------------------
public static void quickSort(int [] arr,int i,int j){
    //定义两个变量记录要查找的范围
    int start=i;
    int end=j;

    //递归出口
    if (start>end){
        return;
    }


    //记录基准数--每轮结束后都会向后移一个
    int baseNumber=arr[i];
    //利用循环找到要交换的数字
    while(start!=end){
        //利用end,从后往前开始找,找比基准数小的数字
        while(true){
            if (end<=start||arr[end]<baseNumber){
                break;//end和start重合 或 找到了 就跳出循环
            }
            //否则继续向前找
            end--;
        }
        //利用start,从前往后找,找比基准数大的数字
        while(true){
            if (end<=start||arr[start]>baseNumber){
                break;//end和start重合或 找到了 就跳出循环
            }
            //否则继续向后找
            start++;
        }
        //把end和start指向的元素进行交换
        int temp=arr[start];
        arr[start]=arr[end];
        arr[end]=temp;
        //交换完继续循环,找下一对可交换的数,直到start=end时停止
    }
    //当start和end指向了同一个元素的时候,那么上面的循环就会结束
    //*start和end指向同一个元素的位置就是基准数应存入的位置*

//现在就该基准数归位了
//就是拿着这个范围中的第一个数字arr[i],跟start或end指向的元素进行交换
    int temp=arr[i];
    arr[i]=arr[start];
    arr[start]=temp;
    //确定刚刚归位数左边的范围,重复刚刚所做的事情
    quickSort(arr,i,start-1);
    //确定刚刚归位数右边的范围,重复刚刚所做的事情
    quickSort(arr,start+1,j);
}
  • 最后是使用了递归算法
  • 最后的 基准数归位和递归算法中的 start 换成 end 也行,因为它们最后都指向了同一个位置
  • 读代码要有耐心

总结:

JAVA算法—排序,算法,java,排序算法文章来源地址https://www.toymoban.com/news/detail-820012.html

到了这里,关于JAVA算法—排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 归并排序算法(Java实现)

    也称 合并排序算法 ,是将两个或两个以上的有序数据序列合并成一个新的有序数据序列。该算法采用分治法(Divide and Conquer)的思想,将待排序的序列分成若干个子序列,分别对子序列进行排序,然后将有序的子序列合并成一个大的有序序列 注:将几个有序队列合并成一个

    2024年01月17日
    浏览(38)
  • (四)Java算法:冒泡排序

       冒泡排序 (Bubble Sort),是一种计算机科学领域的较简单的排序算法。它的工作原理是:它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果不是指定顺序(比如从小达到)就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也

    2024年02月04日
    浏览(87)
  • Java基础(七)排序算法

    1. 冒泡排序 冒泡排序的思想 冒泡排序是一种简单的排序算法,其基本思想是通过多次遍历待排序序列,依次比较相邻的元素并交换位置,使得每次遍历后最大(或最小)的元素冒泡到序列的末尾。 具体步骤如下: 从待排序序列的第一个元素开始,依次比较相邻的两个元素。

    2024年02月13日
    浏览(92)
  • 【JAVA】七大排序算法(图解)

    稳定性: 待排序的序列中若存在值相同的元素,经过排序之后,相等元素的先后顺序不发生改变,称为排序的稳定性。 思维导图: (排序名称后面蓝色字体为 时间复杂度和稳定性 ) 核心思路 每次从无序区间中选择第一个元素,插入到有序区间的合适位置,直到整个数组有

    2024年02月12日
    浏览(34)
  • JAVA算法—排序

    目录 *冒泡排序: *选择排序: 插入排序: 快速排序: 总结: 以下全部以升序为例 引用: 在完成升序排序时 ,最大的元素会经过一轮轮的遍历逐渐被交换到数列的末尾,就像气泡从水底慢慢升到水面的过程。这个过程会重复进行,直到整个序列有序,即没有更多的“气泡

    2024年01月24日
    浏览(41)
  • 希尔排序【Java算法】

    希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量

    2024年02月12日
    浏览(30)
  • Java 排序算法

    冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地遍历要排序的数列,比较相邻元素的大小并交换位置,使得较大的元素逐渐向数列的末尾移动。 以下是Java实现的冒泡排序代码: 该算法的时间复杂度为O(n^2),其中n是待排序数列的长度。 选择排序(Selection Sort)是

    2024年04月17日
    浏览(24)
  • 快速排序【Java算法】

    快速排序是一种比较高效的排序算法,采用 “分而治之” 的思想,通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序

    2024年02月14日
    浏览(53)
  • Java常见的排序算法

    排序分为内部排序和外部排序(外部存储) 常见的七大排序, 这些都是内部排序 。 1、插入排序:每次将一个待排序的记录,按其 的大小插入到前面已排序好的记录序列 中的适当位置,直到全部记录插入完成为止。 稳定排序算法 一个排序算法的稳定性与不稳定性是

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包