排序
c++排序算法
霜叶逐风
这个作者很懒,什么都没留下…
展开
-
信息学奥赛一本通1328:【例7.7】光荣的梦想
【题目描述】Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯。在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界、保卫这里的平衡与和谐。在那个时代,平衡是个梦想。因为有很多奇异的物种拥有各种不稳定的能量,平衡瞬间即被打破。KB决定求助于你,帮助他完成这个梦想。一串数列即表示一个世界的状态。平衡是指这串数列以升序排列。而从一串无序数列到有序数列需要通过交换数列中的元素来实现。KB的能量只能交换相邻两个数字。他想知道他最少需要交换几次就能使数列有序。原创 2024-08-27 10:41:40 · 792 阅读 · 0 评论 -
排序——选择排序
在选择排序中,共进行n次选择,每次选择进行n-i次遍历,即(n-1)+(n-2)+(n-3)+…+1=n(n-1)/2,故时间复杂度为O(此外,由于所需存储空间不会随着n的变化而变化,因此空间复杂度为O(1),属于稳定但效率较低的算法。每次从待排序数组中选出最大或最小的一个元素,与待排序数组的第一个元素交换位置,直到数组有序。原创 2024-08-23 12:11:13 · 95 阅读 · 0 评论 -
排序——冒泡排序
对于有些数据,可能不需要n-1轮排完,例如6 1 2 3 4 5,只需要一轮冒泡就可以排序完。于是,我们可以设置一个变量,如果一整轮冒泡都没有元素交换位置,说明整个数组都已有有序,在此退出循环,可以减少几轮冒泡。在待排序数组中,从第一个开始,依次比较相邻两个元素是否逆序,若为逆序对,则交换这两个元素的位置,经过一轮比较,最大或最小的元素排在最后,接着对第一个到第n-1个元素重复此操作,直至数组有序。在冒泡排序中,共进行n-1轮冒泡,每轮冒泡需进行n-i次比较,即(n-1)+(n-2)+(n-3)+…原创 2024-08-23 22:54:40 · 189 阅读 · 0 评论 -
排序——插入排序
像打牌一样,抓到的牌一本按照大小插入适当的位置,这样抓完所有的牌后,手中的牌便是有序的。同理,当读入一个元素时,在已经排序好的序列中找到它正确的位置,放入读入的元素,同时将它后面的所有元素向后移一位。在插入排序中,共进行n-1次选择,每次选择需遍历从i-1到1的区间,即1+2+…+(n-2)+(n-1)=第一步: 【9】8 6 7 5 4 2 3 1。第八步: 【2。第二步: 【第六步: 【第七步: 【第九步: 【原创 2024-08-24 10:45:19 · 163 阅读 · 0 评论 -
排序——计数排序
计数排序统计各数出现的次数由输入数据的多少而定,因此该算法的时间复杂度为O(n),所需的存储空间据实际情况自行定义,空间复杂度为O(n),桶排序在特定情况下效率高,简单,缺点是只有待排序数据在一定范围内,数据为整型,且前后跨度较小时使用,否则将占用大量存储空间。当待排序的值在一个有限的范围内,可设计有限个有序桶,待排序的值装入相对应的桶,顺序输出各桶的值,将得到有序的数列。原创 2024-08-25 15:35:23 · 145 阅读 · 0 评论 -
排序——快速排序
首先将待排序的数组以mid(mid=(1+n)/2)为记点,左边子序列中的元素若比mid大则移动到右边子序列中,右边子序列中的元素若比mid大则移动到左边子序列中,使得左边子序列中的元素均比mid小或等于mid,右边子序列中的元素均大于mid。对左右子序列重复此操作,直至排序完成。快速排序本质是将一个长度为n的数组拆分成两个子序列,寻找一个中间记点,将小于记点的元素放置在左边,大于记点的元素放在右边,接着对这两个子序列重复此操作,因此该算法的时间复杂度为O(属于不稳定但平均时间最快的一种排序方法。原创 2024-08-25 16:37:17 · 216 阅读 · 0 评论 -
排序——归并排序
归并排序分为两大步:分解,合并。首先递归地将数组分成两个子序列,若子序列长度不为1,则继续递归地将子序列分解成两个小子序列,直至每个小子序列长度为1(有序),接着将两个有序的子序列合并成一个有序序列。在处理数据规模较小,数据较大和较多相等元素情况下优于快速排序;但在数据规模大和空间利用率上,快速排序优于归并排序。),同时它在运行时不会将两个相等的元素交换位置,属于稳定的算法。且它需要额外的辅助空间,因此它的空间复杂度为O(归并排序和快速排序一样,将原数组不断的分解成两个子序列,它的时间复杂度为O(原创 2024-08-27 10:15:53 · 201 阅读 · 0 评论