一起学算法(选择排序篇)

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

       距离上次更新已经很久了,以前都是非常认真的写笔记进行知识分享,但是带来的情况并不是很好,一度认为发博客是没有意义的,但是这几天想了很多,已经失去了当时写博客的初心了,但是我觉得应该做点有意义的事,将知识分享给那些乐于学习想钻研的同学,我们可以一起学习,一起进步,所以想出以个系列(算法篇),将我学习算法的过程记录下来,一起加油!!!废话不多说,看正片

1. 概念:

选择排序(Selection sort)是一种简单直观的排序算法,由于是选择,所以在交换的过程中元素的相对位置可能会发生变换,所以该算法是不稳定排序

选择排序中的关键在于,怎么找出一堆数据中最小(最大)的,和冒泡排序相比,选择排序比冒泡排序的效率高,高在交换位置的次数上,选择排序的交换位置是有意义的交换,每次遍历剩下的元素找到最小值(最大值),拿到这个最值与最前面的元素进行交换

一起学算法(选择排序篇),一起学算法,排序算法,算法

 举个栗子:假如我们现在需要给一个数组进行排序[3,2,5,9,4];

第一次参与比较的数据:3  2  5  9  4(最前面的元素索引为0,所以找到最小的元素和索引为0的元素进行交换)

最小值:3 2 5 9 4-->2

所以交换完数组中变为2  3  5  9  4

第二次参与比较的数据3  5  9  4(最前面的索引为1)

最小值:3 5 9 4

所以交换为数组变为3  5  9  4(因为本身索引为1的元素就是数组中元素最小的,所以不需要进行交换位置)

依次类推...

最后排好序的数组是[2,3,4,5,9]

具体实现:使用双重循环,外层循环控制比较的次数,内循环找出每次比较数据中的最小值,然后将其放入已排序的末尾

 public void selection(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) { // 寻找的次数
            // 假设i的位置就是数组中未排序元素值中最小值的位置
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) { // 与后面的元素进行比较
                if (arr[minIndex] > arr[j]) {
                    minIndex = j;
                }
            }
            // 若最小值不等于当前i,则进行交换
            if (minIndex != i) {
                int temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }
    }

2.leetcode题单

学会选择排序,我们可以顺便解决leetcode上的这些题:

颜色分类

寻找两个正序数组的中位数

至少是其他数字两倍的最大数

判断能否形成等差数列文章来源地址https://www.toymoban.com/news/detail-619395.html

颜色分类:
class Solution {
    public void sortColors(int[] nums) {
        if (nums == null || nums.length == 0) {
            return;
        }
        //计数排序
        int max=Arrays.stream(nums).max().getAsInt();
        int[] hash=new int[max+1];
        for (int i = 0; i <nums.length; i++) {
            hash[nums[i]]++;
        }
        int index=0;
        for (int i = 0; i <hash.length; i++) {
              int n=hash[i];
              while(n!=0){
                  nums[index++]=i;
                  n--;
            }
        }
    }
}
寻找两个正序数组的中位数
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if (nums1 == null && nums2 == null) {
            return 0;
        }
        //将两个数组合并成一个数组然后取中间值
        int[] sortNum = new int[nums1.length + nums2.length];
        int q = sortNum.length;
        ;
        int i = 0;
        int j = 0;
        int k = 0;
        int m = nums1.length;
        ;
        int n = nums2.length;
        while (i < m && j < n) {
            if (nums1[i] < nums2[j]) {
                sortNum[k++] = nums1[i++];
            } else {
                sortNum[k++] = nums2[j++];
            }
        }
        while (i < m) {
            sortNum[k++] = nums1[i++];
        }
        while (j < n) {
            sortNum[k++] = nums2[j++];
        }
        //数组分为奇数和偶数
       if((q&1)==1){
           return sortNum[q/2];
       }else{
           return (sortNum[q/2]+sortNum[(q/2)-1])/2.0;
       }
    }
    }
至少是其他数字两倍大的数字
class Solution {
      public int dominantIndex(int[] nums) {
        if (nums == null) {
            return 0;
        }
        int max=nums[0];
        int maxIndex = 0;
        for (int i = 1; i < nums.length; i++) {
             if(nums[i]>max){
                 max=nums[i];
                 maxIndex=i;
             }
        }
        Arrays.sort(nums);
        if (nums[nums.length - 1] >= 2 * nums[nums.length - 2]) {
            return maxIndex;
        }else{
            return -1;
        }
    }
}
判断能否形成等差数列
class Solution {
    public boolean canMakeArithmeticProgression(int[] arr) {
        if(arr==null||arr.length==0){
            return false;
        }
        Arrays.sort(arr);
        int k=arr[1]-arr[0];
        for (int i =1; i <arr.length; i++) {
            if(arr[i]-arr[i-1]!=k){
                return false;
            }
        }
        return true;
    }
}

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

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

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

相关文章

  • 【算法之排序篇】 堆排序详解!(源码+图解)

    🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 什么是堆排序?堆在原数据结构上是怎么实现堆排从而使数据有序的? 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行

    2024年02月04日
    浏览(57)
  • 排序算法:选择排序(直接选择排序、堆排序)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、   目录 前言: 1.选择

    2024年02月09日
    浏览(29)
  • 【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

    目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现: 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析  代码实现: 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大(或最小)的元素移到右边(或左边

    2024年01月19日
    浏览(38)
  • 【排序篇1】插入排序、希尔排序

    思路: 插入排序就像玩扑克牌,抽出一张牌作为比较的元素,与前面的牌依次进行比较,小于继续往前比较,大于等于停下插入到当前位置。 图示: 注意:总共的排序次数是n-1趟,即end最多只能到倒数第二个元素,因为如果end为最后一个元素,那么end+1的位置就是越界的。

    2024年01月17日
    浏览(26)
  • 【算法】排序——选择排序和交换排序(快速排序)

     ========================================================================= 主页点击直达: 个人主页 我的小仓库: 代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法头疼记:算法专栏  =========================

    2024年02月08日
    浏览(34)
  • 【数据结构与算法】排序算法(选择排序,冒泡排序,插入排序,希尔排序)

    基本概念这了就不浪费时间解释了,这四种都是很简单的排序方式,本专栏后续文章会出归并排序,计数排序,快速排序,堆排序,桶排序等排序算法,今天这篇文章中给出选择排序,冒泡排序,插入排序和希尔排序的实现; 如果发现文章中有错误,还请大家指出来,我会非

    2024年02月15日
    浏览(50)
  • 排序算法(一) -- 选择排序和冒泡排序

    选择排序和冒泡排序是我们初学C语言必学的两种简单的排序算法,也是我们以后学习数据结构与算法课程中更复杂的排序算法的基础。本文用由浅入深的逻辑条理,试图将这两种排序算法讲解清楚。 本文所有的排序均是针对一维数组的,全文所用的一维数组的例子如下: 一

    2024年02月06日
    浏览(25)
  • 排序算法之详解选择排序

    选择排序顾名思义是需要进行选择的,那么就要问题了,选择到底是选择什么呢? 选择排序的选择是 选择 数组中 未排序的数组 中 最小的值 ,将被选择的元素放在 未排序数组 的 首位 如果你对 ‘未排序数组’ , ‘选择’ 的概念不理解,那么你可以看看下面的图 有了上面

    2023年04月25日
    浏览(35)
  • 排序算法:选择排序

    选择排序的思想是:双重循环遍历数组,每经过一轮比较,找到最小元素的下标,将其交换至首位。         选择排序就好比第一个数字站在擂台上,大吼一声:“还有谁比我小?”。剩余数字来挨个打擂,如果出现比第一个数字小的数,则新的擂主产生。每轮打擂结束

    2024年02月11日
    浏览(72)
  • 【算法系列 | 3】深入解析排序算法之——选择排序

    你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级论点 蓝色 :用来标记二级论点 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力

    2024年02月08日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包