C#:快速排序,有相同的数字会忽略,然后继续先前的寻找方向去找下一个满足要求的数字进行替换
概述
挖坑填数+分治法
对挖坑填数进行总结
- i =L; j = R; 将基准数挖出形成第一个坑a[i],例如第一次的基准数就是0索引的
- j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
- i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
- 再重复执行2,3二步,直到i==j,将基准数填入a[i]中,相遇时再按照基准更新左半边索引,和右半边索引
- quick_sort(s, l, i - 1);quick_sort(s, i + 1, r);递归调用,直到每个递归的l 与 r相等,结束递归
void quick_sort(int s[], int l, int r)
{if (l < r){int i = l, j = r, x = s[l];while (i < j){while(i < j && s[j] >= x) // 从右向左找第一个小于x的数--j; if(i < j)s[i++] = s[j]; while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数++i; if(i < j)s[j--] = s[i];}s[i] = x;quick_sort(s, l, i - 1); // 递归调用quick_sort(s, i + 1, r);}
}
快速排序如果有相同数字的时候是怎样的过程
有相同的数字会忽略,然后继续先前的寻找方向去找下一个满足要求的数字进行替换
测试
int[] array = new int[8] { 5 ,2, 2, 1, 7 ,3, 4, 4 };
时间复杂度
O (nlogn)
O(log n)解析
再比如O(log n),当数据增大n倍时,耗时增大log n倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(log n)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。
通俗易懂的例子
这个就像是有一百把钥匙,你突然觉得,我从头找是不是太慢了,我从中间找,比如我要找到23号的房间钥匙,我从中间切开,找到50编号的位置,然后23在150里面,我再把从中间切开变成25,然后23在125之间,我再切开变成12.5,然后23在12.5~25之间,依次找下去,直到找到钥匙。这种查找钥匙的方法的复杂度就是O(log^n)
O(n log n)解析
O(n log n)同理,就是n乘以log n,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(n log n)的时间复杂度。
源码
https://github.com/luoyikun/UnityForTest
SortScene场景
C#:快速排序,有相同的数字会忽略,然后继续先前的寻找方向去找下一个满足要求的数字进行替换相关推荐
- 【C++代码】约瑟夫环问题:0,1,……,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
问题描述:0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 这是力扣上的一道题.我的思路: ①首先想到的是用循环链表,每次向后遍历 ...
- -9 逆序输出一个整数的各位数字_逆序对个数(归并排序)
题目描述 输入 N 组数据,对每组数据输出逆序对个数. 输入 对于每组测试用例,第一行输入此组数据元素个数 x,接下来 x 行,每行一个数,表示元素.(1≤x≤500000)(1≤x≤500000) ...
- 专访 | 宋星 10 年启示录:数字营销如何觐见下一个 10 年?
专访ID : 纷析数据创始人 "获客-说服-转化的标准模型已经不能完全适用今天的数字营销." --宋星 导 读 宋星无疑是中国互联网营销领域的一个举足轻重的人物,不需要任何刻意 ...
- 中国电子学会scratch等级考试四级编程题:找出出现次数最多的数字
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 我们将有关编程题目的教学视频已经发布到抖 ...
- 数字证书采用公钥体制进行加密和解密。每个用户有一个私钥,用它进行 (46)。。。
数字证书采用公钥体制进行加密和解密.每个用户有一个私钥,用它进行 (46) : 同时每个用户还有一个公钥,用于 (47) . X.509标准规定,数字证书由 (48) 发放,将其放入公共目录中,以供用 ...
- 找出数组中重复的数字---多思路
问题:找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...
- 剑指offer 面试题三 找出数组中重复的数字
1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...
- python游戏最简单代码-如何利用Python开发一个简单的猜数字游戏
前言 本文介绍如何使用Python制作一个简单的猜数字游戏. 游戏规则 玩家将猜测一个数字.如果猜测是正确的,玩家赢.如果不正确,程序会提示玩家所猜的数字与实际数字相比是"大(high)&q ...
- struct 模块 把一个类型,如数字,转成固定长度的bytes
该模块可以把一个类型,如数字,转成固定长度的bytes import structheaders=struct.pack('i',132333) print(headers,len(headers)) ...
最新文章
- Cell子刊:根瘤菌微生物群落的模块化特征及其与共生根瘤菌的进化关系
- jQuery面试题-区别mouseover和mouseenter的不同之处(看了也许对你有好处)
- java 获取当月第一天和最后一天 获取前一个月第一天和最后一天
- 从您的计算机移除此产品,解决office提示“此操作只对目前安装的产品有效”的方法...
- SQL本地事务、asp.net事务、DTC
- ubuntu将一个文件夹下的所有内容复制到另一个文件夹下
- Linux 自定义快捷命令
- 【log4cpp_学习】1_log4cpp的安装
- 华为鸿蒙系统支持什么手机_华为鸿蒙系统支持的手机型号_鸿蒙系统支持华为哪几款手机...
- 听听股市的几个出了名的魔咒
- 第四届传智杯 小卡与质数(java实现)
- SaaS最通俗易懂的解释是什么?看这篇就够了
- VSCode-工控机远程开发 之(一) VSCode无法连接扩展商店
- 菜单转换Java_java递归菜单树转换成pojo对象
- MySQL慢SQL探究
- ubuntu18.04安装搜狗输入法
- Linux2019/7/30.1
- 【MySQL】16-超详细的MySQL单行函数汇总
- python可视化水平双向箭头_科学网—Python matplotlib quiver—画箭头、风场、量场图 - 张伟的博文...
- 把自己开发的Mac软件提交给苹果官网下载频道的方法