排序算法-N个正整数排序

本文为胡秉亮原创文章,首发于 前端学习指南

一. 算法

高德纳在《计算机程序设计艺术》里对算法归纳为以下几点:

  1. 输入: 一个算法必须有零或以上的输入量
  2. 输出: 一个算法应有一个或以上的输出量
  3. 明确性: 算法的描述必须无歧义,实际运行结果是确定的
  4. 有限性: 必须在有限个步骤内结束
  5. 有效性: 又称可行性,能够被执行者实现

如果想详细研究算法推荐《数据结构与算法分析》

二. 定义问题

也就是需求:

数组array含有N个正整数
输入量为array
请将array中的数字从小到大排列
输出量为排好序的数组

代码例子

var array = [5,2,4,6,8]
function sort(){
   你的代码
}
sort(array) // [2,4,5,6,8]

当你遇到思路障碍怎么办?

  • 将抽象的问题转化为具体的问题
  • 将没见过的问题转化为见过的问题

三. 排序算法

所有算法都可在此查看演示

1. 冒泡排序(BUBBLE)

重复地比较要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。比较数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。每比较一整轮,最大的都会出现在最后故名---冒泡排序

流程如下:

  1. 我们拿到一个数组

  2. 开始从前两个开始比较,发现44>3,所以不用交换
  3. 接着往后比较,发现38<44,所以交换他们两个的位置
  4. 以此类推直到第一轮结束,我们得到了最大的那一个----50(冒的第一个泡)

    第一轮结束
  5. 接着下一轮,又从头开始两个两个地比较,重复第一轮,我们就得到了第二个最大的------48

    第二轮结束

  6. 如此进行多轮比较我们会得到一个从小到大的数组

2. 选择排序(SELECT)

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
流程如下:

  1. 拿到一个数组
  2. 我们要选出这个数组中最小的元素然后把它和第一个数交换(放到最前面),所以我们先认为3为最小,然后和后面的数依次进行比较.
  3. 当比到2的时候,我们发现3>2,所以我们就认为2为最小值,后面的数应该都和2进行比较.
  4. 当比较完所有的元素,确定2为最小值的时候,把最小值也就是2与第一个元素的位置互换.
  5. 然后从第二个元素开始新一轮的比较,过程和第一轮一样.把44看做最小值和后面的元素进行比较.
  6. 经过多轮比较得到从小到大的数组.

3. 插入排序(INSERT)

将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。是稳定的排序方法。
流程如下:

  1. 拿到一个数组
  2. 把第一个元素看做一个新数组,然后把第二个元素依次和新数组的元素进行比较(虽然只有一个...),然后插入到适当的位置.

    与新数组的元素进行比较

    插入到适当的位置
  3. 然后以此类推,把前两个元素看做是一个新数组,然后把第三个元素依次与新数组进行比较,然后插入到适当的位置.

    比较

    插入适当的位置
  4. 把剩下的元素依次插入,最后得到从小到大排列的数组.

4. 归并排序(MERGE)

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
流程如下:

  1. 拿到一个数组
  2. 我们把数组平均分成左右两部分,得到两个新数组,然后再把每个数组平均分成两部分,一直分到每个数组只有两个元素,然后比较第一组
  3. 因为3<44所以位置不变然后比较第二组,因为38>5所以调换位置.
  4. 重点来了,这个时候先不着急比较第三组而是把排好序的一二两组放在一起排序.
  5. 之后就是比较第三组和第四组,然后同样把他们放在一起排好序.
  6. 然后并不是比较第五组和第六组,而是把第一组和第二组产生的新数组和第三组和第四组产生的新数组放在一起排序成为新数组.
  7. 同样把剩下的按以上步骤重来一遍.我们得到两个排好序的数组.然后给这两个数组排序就完成了.

    排序后:

5. 快速排序

每个元素找到自己对应的位置(前面的都比我小,后面的都比我大)
流程如下:

  1. 拿到一个数组
  2. 拿第一个元素和后面的元素进行比较,找出所有比第一个元素小的元素,放在第一个元素的右边然后把第一个元素与这些比他小的元素的最后一个互换.

    只有2比3小

    互换
  3. 前两个元素的位置已经没错了,然后以第三个元素为标准,和后面的元素进行比较.
  4. 把比他小的元素放在他的右边(绿色),然后让它和绿色的最后一个交换位置.
  5. 然后从左边没有确定位置的元素(非橙色)开始以上步骤----也就是19
  6. 一直到所有元素的位置都正确.

6. 随机快速排序

顾名思义,就是在快速排序的基础上,加入随机的机制.
在快速排序的时候我们是从左到右来选取比较对象,在随机快速排序中我们是随机来选取对象.
流程如下:

  1. 拿到一个数组
  2. 随机选择一个元素,随机选择到了44.
  3. 并且把比他小的放在他的右边
  4. 然后把他和比他小的最右边的元素交换位置
  5. 然后在随机选一个元素,重复步骤,直到所有元素都是在正确的位置

    加微信号: astak10或者长按识别下方二维码进入前端技术交流群 ,暗号:写代码啦

每日一题,每周资源推荐,精彩博客推荐,工作、笔试、面试经验交流解答,免费直播课,群友轻分享... ,数不尽的福利免费送

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Python内置的sorted函数对输入的若干个整数进行升序排列。示例代码如下: ``` numbers = input("请输入若干个整数,用空格分隔:").split() numbers = [int(x) for x in numbers] # 将输入的字符串转换为整型列表 sorted_numbers = sorted(numbers) print("升序排列后的结果为:", sorted_numbers) ``` 若要按降序排列,则可以使用sorted函数的reverse参数,将其设置为True,或者使用sort函数的sort(reverse=True)方法。 ### 回答2: 在Python中,可以使用以下3种方法来进行若干个正整数的输入及升序排序输出: 方法1:使用input()和split()函数逐一输入正整数,使用sort()函数进行升序排序,最后使用for循环进行输出。 示例代码如下: ```python # 输入数据 nums = input("请输入若干个正整数,以空格分隔:").split() # 将输入的字符串转换成整数类型 nums = [int(num) for num in nums] # 将列表进行升序排序 nums.sort() # 输出结果 for num in nums: print(num, end=' ') ``` 方法2:使用input()和split()函数一次性输入多个正整数,使用sorted()函数进行升序排序,最后使用join()函数进行输出。 示例代码如下: ```python # 输入数据 nums = input("请输入若干个正整数,以空格分隔:").split() # 将输入的字符串转换成整数类型后进行排序 nums = sorted([int(num) for num in nums]) # 输出结果 print(" ".join(str(num) for num in nums)) ``` 方法3:使用for循环和append()函数逐一输入正整数,使用sorted()函数进行升序排序,最后使用join()函数进行输出。 示例代码如下: ```python # 输入数据 nums = [] n = int(input("请输入要输入的正整数个数:")) for i in range(n): nums.append(int(input("请输入第" + str(i+1) + "个正整数:"))) # 对输入的列表进行升序排序 nums = sorted(nums) # 输出结果 print(" ".join(str(num) for num in nums)) ``` 无论使用哪种方法,都可以实现若干个正整数的输入及升序排序输出。但需要注意的是,输入的数据需要是正确的正整数,否则引发输入类型错误或排序错误。 ### 回答3: Python 是一种非常优秀的编程语言,其简洁、易读、易用的特点使得其在程序员中非常受欢迎。在这里,我们将介绍 Python 中如何输入若干个正整数进行排序,然后将其输出。 首先,我们需要使用 Python 的 input 函数来获取用户输入的正整数,如下所示: ``` n = int(input("请输入你需要输入的正整数的个数:")) nums = [] for i in range(n): num = int(input("请输入第%d个正整数:" % (i+1))) nums.append(num) nums.sort() print("排序后的结果为:", nums) ``` 在上面的代码中,我们定义了一个变量 n 来存储用户需要输入的正整数的个数,然后通过 for 循环逐一获取用户输入的正整数。在获取每一个正整数后,我们将其存储在列表 nums 中。最后,我们调用列表的 sort 方法对其进行升序排序,并使用 print 函数输出排序后的结果。 需要注意的是,该程序中没有对用户输入的数进行判断,也不知道是不是正整数。如果用户输入了非正整数,程序可能出现错误。因此,我们需要在程序中添加一些错误处理的语句,以保证程序能够正常执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值