位运算在排序算法中的运用

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

常规选择排序

function selectSort(arr: Number[]) {
    //先排除一些不需要排序的情况
    if (!arr || arr.length < 2) {
        return arr
    }
    let a =arr
    //外层循环控制循环n-1次
    for (let i = 0; i < a.length-1; i++) {
        let index = i
        //内层循环获取该轮循环中最小值的下标
        for (let j = i + 1; j < a.length; j++) {
            if (a[j] < a[index]) {
                index = j
            }

        }
        if(i!==index){
            let temp = a[i]
            a[i]=a[index]
            a[index]=temp
        }
    }


    return a



}

使用位运算的选择排序

function selectSortUseByte(arr) {
    if (!arr || arr.length < 2) {
        return arr
    }

    for (let i = 0; i < arr.length - 1; i++) {
        for (let j = i; j < arr.length; j++) {
            if (arr[j] < arr[i]) {
                swap(arr, i, j)
            }
        }
    }
    //交换值时使用位运算
    function swap(arr, a, b) {
        arr[a] = arr[a] ^ arr[b]
        arr[b] = arr[a] ^ arr[b]
        arr[a] = arr[a] ^ arr[b]
    }
    return arr
}

异或是如何实现值交换的

异或的性质

  • 满足交换律和结合律

ab=ba

abc=a(bc)

a^a=0

0^a=a

function swap(arr, a, b) {
        arr[a] = arr[a] ^ arr[b]
        //此时arr[a]=arr[a]^arr[b],执行下面的运算后,arr[b]=arr[a]^arr[b]^arr[b]=arr[a]^0=arr[a]
        arr[b] = arr[a] ^ arr[b]
        //执行下面的运算,arr[a]=(arr[a]^arr[b])^arr[a]=arr[b]
        arr[a] = arr[a] ^ arr[b]
        //这样就巧妙地将两个值进行了交换,且没有开辟新的存储空间
    }

拓展

找出唯一的出现奇数次的数

现有N个数,除了唯一的一个数出现的次数是奇数,其他的均是出现了偶数次的数,现在请编程找出这个出现奇数次的数

/**
* 
* @param arr 要处理的数组
* @returns 返回出现奇数次的数
*/

function getOddNubmer(arr){
   let r=0
   //挨个遍历数组里面的数进行异或操作,出现偶数次的数最终会被异或成0,最后剩下的就是出现偶数次的数
   for(let k of arr){
       r^=k
   }
   return r
}

找出数组中出现奇数次的两个数

N个数,其中除了两个数出现奇数次,其他数都出现了奇数次,现在找出这两个数文章来源地址https://www.toymoban.com/news/detail-458983.html

function getOddNumberTwo(arr) {
    let r = 0
    //假设这两个数是a和b,此处获取a^b
    for (let k of arr) {
        r ^= k
    }
    //获取a和b中为1的最低位
    let rightone = r & (~r + 1)
    let first = 0
    for (let k of arr) {
        //筛选出满足rightone的数据,其中将只包含a和b其中一个,进行异或操作后就可得到其中一个数
        if ((k & rightone) == 0) {
            first ^= k
        }
    }
    //将a和b异或的和再与第一个数进行异或运算,就得到了第二个数
    let second = r^first

    return [first,second]
}

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

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

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

相关文章

  • 【算法】排序——选择排序和交换排序(快速排序)

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

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

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

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

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

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

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

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

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

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

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

    2024年02月08日
    浏览(41)
  • 【数据结构】常见排序算法——常见排序介绍、选择排序(直接选择排序、堆排序)交换排序(冒泡排序)

      选择排序是一种简单但不高效的排序算法,其基本思想是从待排序的数据中选择最小(或最大)的元素放到已排序的数据末尾。具体操作步骤如下: (1)找到数据中最小的元素,并把它交换到第一个位置; (2)在剩下未排序的元素中找到最小的元素,并把它交换到已排

    2024年02月04日
    浏览(52)
  • 排序算法(初阶)【冒泡,插入,选择排序】

    比较相邻的两个元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这被称为一趟冒泡排序 这样就可以把数组中要排序的数中的最大值放到最后,也相当于把一个元素排在了元素有序时它应处于的位置,它既

    2024年01月21日
    浏览(48)
  • 排序算法一:冒泡、选择、插入排序

    目录         冒泡排序 理论 代码实现 时间复杂度 选择排序 理论 代码实现  时间复杂度 插入排序 理论分析 代码实现 时间复杂度    冒泡,我们很容易联想到水煮沸,或者是鱼儿吐泡的情景,水泡会在水中上升到达水面。冒泡排序正如其名,即大的数一个个往上冒出来。

    2024年02月22日
    浏览(39)
  • 基础算法(1):排序(1):选择排序

         今天对算法产生了兴趣,开始学习基础算法,比如排序,模拟,贪心,递推等内容,算法是很重要的,它是解决某个问题的特定方法,程序=数据结构+算法,所以对算法的学习是至关重要的,它可以提高程序效率,不同的算法也是有优劣的,如何进行评价,这也是我们需

    2024年02月04日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包