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

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

★什么是分治:

分治指把问题分为多个小问题,对每个小问题进行求解(小问题可以继续分),将所有小问题的解和在一起,就是这个问题的解。

主问题

|

—————————————————————————————————————

| | | | | | |

问题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|

——————————— ——————————— ——————————— ——————————— ———————————

✓|| ✕ ✓|| ✕ ✓|| ✕ ✓||✕ ✓

相关推荐

开户名称是什么意思?开户名称和开户银行有什么区别?
亚马逊自营的货是谁提供的?自营从哪里发货?
365bet网址是多少

亚马逊自营的货是谁提供的?自营从哪里发货?

📅 06-30 👁️ 6158
《千牛》设置消息提示音方法
全球最大体育平台365

《千牛》设置消息提示音方法

📅 06-29 👁️ 338