分治排序,插值查找和常用排序讲解

★什么是分治:
分治指把问题分为多个小问题,对每个小问题进行求解(小问题可以继续分),将所有小问题的解和在一起,就是这个问题的解。
主问题
|
—————————————————————————————————————
| | | | | | |
问题1 问题2 问题3 ………… 问题4 问题5 问题6
| | | | | | |
解答1 解答2 解答3 ………… 解答4 解答5 解答6
| | | | | | |
—————————————————————————————————————
|
主问题的解
★插值查找:
如果数组中的元素是相对均匀的递增或递减,可以计算出要找的数的大概率出现下标。


|10|20|30|40|50|
————————————————
0 1 2 3 4
平均递增第1个坐标,递增的值为:(50-10)/(4-0)=10。
平均递增第1个值,递增的坐标为:(4-0)/(50-10)=0.1。
如果从下标为0开始找40这个数,大概的坐标计算为:0+(40-10)((4-0)/(50-10))=3。
综上所述,从left开始找值为x的数,计算坐标为:left+(x-a[left])
((right-left)/(a[right]-a[left]))。
★快速排序:
原理:首先选一个轴值,将待排序的数组划分成两部分,左侧的元素小于轴值,右侧的元素大于或等于轴值。然后对这两部分再重复以上操作,直到整个序列有序。
例子:(※注意:l=left,r=right)
l r
___________
|2|1|3|5|4|
———————————
0 1 2 3 4
/ j mid i
/
____ ____
|2|1| |5|4|
———— ————
0 1 3 4
i mid j i mid j
| | | |
____ ____
|1|2| |4|5|
———— ————
★冒泡排序:
原理:n个数进行则比较n-1轮,该轮的最后一个数有序;
第i轮,循环下标为0到下标为n-i-1的元素,如果前一个元素大于后一个元素,则交换他们。
例子:


|4|3|2|1|
—————————
0 1 2 3
int a[4]={4,3,2,1};
第1轮:
a[0]>a[1],交换:3,4,2,1;
a[1]>a[2],交换:3,2,4,1;
a[2]>a[3],交换:3,2,1,4;
第2轮:
a[0]>a[1],交换:2,3,1,4;
a[1]>a[2],交换:2,1,3,4;
第3轮:
a[0]>a[1],交换:1,2,3,4;
★选择排序:
冒泡排序的升级版,原理:定义ma,n个数进行则比较n-1轮;
第i轮,循环下标为0到下标为n-i的元素,找出里面的最大数,把ma设为最大数的下标,判断如果不是本轮的最后一个数下标n-i,则交换a[ma]和a[n-i]。
例子:


|4|3|2|1|
—————————
0 1 2 3
int a[4]={4,3,2,1};
第1轮:
循环0到n-1中,a[0]为最大数,0不等于4-1,交换:1,3,2,4;
第2轮:
循环0到n-2中,a[1]为最大数,1不等于4-2,交换:1,2,3,4;
第3轮:
循环0到n-3中,a[1]为最大数,1等于4-3,不交换:1,2,3,4;
★桶排序(箱排序):
原理:统计没个元素出现的次数,每读入一个数,让a[x]++,(※注意:x为读入的数)最后从1循环到输入的最大数,每次输出a[i]个i。(※注意:如果数据量不打,但数据中有一个特别大,则不适合用桶排序)
例子:
输入3,4,4,3,2,0


|0|0|0|0|0|0|
—————————————
0 1 2 3 4 5
第1步:
读入以上的数,每次读入让a[x]++;(※注意:x为读入的数)
第2步:
找到最大数为4;
第3部:
循环0到4,每次循环输出a[i]个i;(※注意:循环套循环)
★插入排序:
原理:整个数组分为有序区和无序区,n个数进行比较则循环n轮,取第1个元素为初始有序区,
其余为无序区,每次把无序区的第第个移到有序区进行排列,直到无序区的数全到有序区,排好序。
例子:(※注意:✓为有序区,✕为无序区)
int a[5]={5,4,3,2,1};
第1步: 第2步: 第3步: 第4步: 第5步:


|5|4|3|2|1| |4|5|3|2|1| |3|4|5|2|1| |2|3|4|5|1| |1|2|3|4|5|
——————————— ——————————— ——————————— ——————————— ———————————
✓|| ✕ ✓|| ✕ ✓|| ✕ ✓||✕ ✓

posted @   ljy15602480308  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示