折半插入排序

合集下载

C语言数组的五种简单排序,选择法排序,冒泡法排序、交换法排序、插入法排序、折半法排序

C语言数组的五种简单排序,选择法排序,冒泡法排序、交换法排序、插入法排序、折半法排序

C语⾔数组的五种简单排序,选择法排序,冒泡法排序、交换法排序、插⼊法排序、折半法排序⽂章⽬录1、选择法排序选择法排序是指每次选择索要排序的数组中的最⼩值(这⾥是由⼩到⼤排序,如果是由⼤到⼩排序则需要选择最⼤值)的数组元素,将这些数组元素的值与前⾯没有进⾏排序的数组元素值进⾏互换代码实现需要注意的是:声明⼀个数组和两个整形变量,数组⽤于存储输⼊的数字,⽽整形变量⽤于存储最⼩的数组元素的数值与该元素的位置,在我的代码中实现为a[] temp position。

代码具体如下#include<stdio.h>int main(){int m,n,k;printf("please input the length of the array:");scanf("%d",&k);int a[k];int temp;int position;printf("please input the number of the array:\n");for(m=0;m<k;m++){printf("a[%d]=",m+1);scanf("%d",&a[m]);}/*从⼩到⼤排序*/for(m=0;m<k-1;m++){temp=a[m]; //设置当前的值为最⼩值position=m; //记录当前的位置for(n=m+1;n<k;n++){if(a[n]<temp){temp=a[n]; //如果找到⽐当前的还要⼩的数值,则更换最⼩的数值与位置position=n;}}a[position]=a[m];a[m]=temp;}for(m=0;m<k;m++){printf("%d\t",a[m]);}return 0;}结果如下2、冒泡法排序冒泡法排序就是值在排序时,每次⽐较数组中相邻的两个数组元素的值,将⽐较⼩的(从⼩到⼤排序算法,如果是从⼤到⼩排序算法就是将较⼤的数排在较⼩的数前⾯)排在⽐较⼤的前⾯在代码实现的过程中:声明⼀个数组与⼀个整型变量,数组⽤于存放数据元素,整型变量⽤于交换时作为中间变量。

排序大全

排序大全

(共八种排序方法:直接插入排序,折半插入排序,冒泡排序,简单选择排序,希尔排序,快速排序,堆排序,归并排序)一.简单排序1.直接插入排序:a)思想:每次从后面无序表中取出第一个元素,通过循环比较把它插入到前面有序表的合适位置,使前面有序表仍然有序。

b)稳定性:稳定c)时空效率:时间复杂度:O(n^2) 空间复杂度:O(1)d)代码:/******************************************function: InsertSort 直接插入排序paramaters: list[] 形参数组length 数组长度(并非最大下标)******************************************/void InsertSort(int list[],int length){int temp,i,j;for(i=1;i<length;i++){if(list[i]<list[i-1]){temp=list[i];//保存小值list[i]=list[i-1];//大值向后移一位for(j=i-1;j>=1&&temp<list[j-1];j--){list[j]=list[j-1];}list[j]=temp;}}}2.折半插入排序:a) 思想:在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到low>hight,找到插入位置low,然后把low到i-1的所有元素均后移一位,再把第i个元素放在目标位置low上。

b) 稳定性:稳定c) 时空效率:时间复杂度:O(n^2) 空间复杂度:O(1)d) 代码:/******************************************function: BInsertSort 折半插入排序又叫二分法插入排序paramaters: list[] 形参数组length 数组长度(并非最大下标)******************************************/void BInsertSort(int p[],int length){int i,j,low,high,m,temp;for(i=1;i<length;i++){temp=p[i];low=0;high=i-1;while(low<=high){m=(low+high)/2;if(p[i]<p[m])//插入点是high+1,而非m,因为有的循环m变化了,而m与high没有发生关系,//循环就结束了,他们的关系还保留在上一层,因此插入点应该用high来保存{high=m-1;}else low=m+1;}// 其实用low更方便点,不用再对low做任何改变/*for(j=i-1;j>=high+1;j--){p[j+1]=p[j];}p[high+1]=temp;*/for(j=i-1;j>=low;j--){p[j+1]=p[j];}p[low]=temp;}}3.冒泡排序:a) 思想:依次比较相邻的两个数,将小数放在前面,大数放在后面。

源代码--数据结构与算法(Python版)chap10 排序

源代码--数据结构与算法(Python版)chap10 排序
20
交换类
(2)快速排序 快速排序采用分而治之(Divide and Conquer)
的策略将问题分解成若干个较小的子问题,采用 相同的方法一一解决后,再将子问题的结果整合 成最终答案。快速排序的每一轮处理其实就是将 这一的基准数定位,直到所有的数都排序完成 为止。
21
快速排序的基本步骤:
1. 选定一个基准值(通常可选第一个元素); 2. 将比基准值小的数值移到基准值左边,形
14
• 交换类
交换类排序的基本思想是:通过交换无序序列 中的记录得到其中关键字最小或最大的记录,并将 其加入到有序子序列中,最终形成有序序列。交换 类排序可分为冒泡排序和快速排序等。
15
交换类
(1)冒泡排序 两两比较待排序记录的关键字,发现两
个记录的次序相反时即进行交换,直到没有 反序的记录为止。因为元素会经由交换慢慢 浮到序列顶端,故称之为冒泡排序。
3. 最后对这个组进行插入排序。步长的选法 一般为 d1 约为 n/2,d2 为 d1 /2, d3 为 d2/2 ,…, di = 1。
11
【例】给定序列(11,9,84,32,92,26,58,91,35, 27,46,28,75,29,37,12 ),步长设为d1 =5、d2 =3、 d3 =1,希尔排序过程如下:
for i in range(1,len(alist)):
#外循环n-1
for j in range(i,0,-1):
#内循环
if alist[j]<alist[j-1]:
alist[j],alist[j-1]=alist[j-1],alist[j] #交换
li=[59,12,77,64,72,69,46,89,31,9] print('before: ',li) insert_sort(li) print('after: ',li)

插入排序解析

插入排序解析
插入排序是一种内部排序方法,其核心思想在于逐步构建有序序列。在直接插入排序中,每次将一个待排序对象按其排序码大小插入到前面已经排好序的对象序列中,通过比较和移动操作找到合适的插入位置。这个过程从第二个对象开始,依次对每个对象进行插入操作,直到整个序列有序。直接插入排序的时间复杂度为O(n2),其中n为待排序对象个数,这是因为在最坏情况下,每个对象都需要与前面的所有对象进行比较和移动。尽管如此,直接插入排序在对象数量较少或序列基本有序时仍具有较高的效率。此外,直接插入排序是一种稳定的排序方法,即相同排序码的对象在排序后保持原有的相对顺序。为了提高插入排序的效率,可以采用折半插入排序,它利用折半查找法来寻找插时间复杂度并未显著降低。

数据结构之各种排序的实现与效率分析

数据结构之各种排序的实现与效率分析

各种排序的实现与效率分析一、排序原理(1)直接插入排序基本原理:这是最简单的一种排序方法,它的基本操作是将一个记录插入到已排好的有序表中,从而得到一个新的、记录增1的有序表。

效率分析:该排序算法简洁,易于实现。

从空间来看,他只需要一个记录的辅助空间,即空间复杂度为O(1).从时间来看,排序的基本操作为:比较两个关键字的大小和移动记录。

当待排序列中记录按关键字非递减有序排列(即正序)时,所需进行关键字间的比较次数达最小值n-1,记录不需移动;反之,当待排序列中记录按关键字非递增有序排列(即逆序)时,总的比较次数达最大值(n+2)(n-1)/2,记录移动也达到最大值(n+4)(n-2)/2.由于待排记录是随机的,可取最大值与最小值的平均值,约为n²/4.则直接插入排序的时间复杂度为O(n²).由此可知,直接插入排序的元素个数n越小越好,源序列排序度越高越好(正序时时间复杂度可提高至O(n))。

插入排序算法对于大数组,这种算法非常慢。

但是对于小数组,它比其他算法快。

其他算法因为待的数组元素很少,反而使得效率降低。

插入排序还有一个优点就是排序稳定。

(2)折半插入排序基本原理:折半插入是在直接插入排序的基础上实现的,不同的是折半插入排序在将数据插入一个有序表时,采用效率更高的“折半查找”来确定插入位置。

效率分析:由上可知该排序所需存储空间和直接插入排序相同。

从时间上比较,折半插入排序仅减少了关键字间的比较次数,为O(nlogn)。

而记录的移动次数不变。

因此,折半查找排序的时间复杂度为O(nlogn)+O(n²)= O(n²)。

排序稳定。

(3)希尔排序基本原理:希尔排序也一种插入排序类的方法,由于直接插入排序序列越短越好,源序列的排序度越好效率越高。

Shell 根据这两点分析结果进行了改进,将待排记录序列以一定的增量间隔dk 分割成多个子序列,对每个子序列分别进行一趟直接插入排序, 然后逐步减小分组的步长dk,对于每一个步长dk 下的各个子序列进行同样方法的排序,直到步长为1 时再进行一次整体排序。

24种插入法

24种插入法

24种插入法24种插入法是一种优化排序算法,它的基本思想是将一个列表分为已排序区间和未排序区间,每次从未排序区间取出一个元素,插入到已排序区间的正确位置,使已排序区间保持有序。

在这个过程中,相邻元素的比较和交换次数都很少,所以可以提高排序的效率。

此外,24种插入法还有一些变体,可以根据不同情况选用相应的插入法,达到更好的排序效果。

以下是24种插入法的详细介绍:1. 直接插入排序直接插入排序是最简单的插入法,它将未排序元素插入到已排序区间合适的位置。

时间复杂度为O(n²),空间复杂度为O(1)。

2. 折半插入排序折半插入排序是对直接插入排序的优化,它采用二分查找的方式找到插入位置。

时间复杂度为O(n²),空间复杂度为O(1)。

3. 希尔排序希尔排序是一种针对直接插入排序的改进,它将列表按照一定步长分组,每个子列表采用直接插入排序,随着步长逐渐缩小,最终变为一组,完成排序。

时间复杂度为O(nlogn),空间复杂度为O(1)。

4. 二路插入排序二路插入排序是对直接插入排序的改进,它采用两个指针,在有序区间之前和之后分别插入未排序元素。

时间复杂度为O(n²),空间复杂度为O(1)。

5. 多关键词插入排序多关键词插入排序是针对多关键词排序的优化,它将排序条件拆分为多个关键词,分别进行插入排序。

时间复杂度为O(nlogn),空间复杂度为O(1)。

6. 基数插入排序基数插入排序是对基数排序的优化,它使用插入法对每个桶内的元素进行排序,并合并桶内已排序的元素。

时间复杂度为O(dn),空间复杂度为O(max)。

7. 大小插入排序大小插入排序是对多关键词排序的优化,它根据元素的大小关系建立排序树,对树进行遍历并插入已排序区间。

时间复杂度为O(nlogn),空间复杂度为O(nlogn)。

8. 块插入排序块插入排序是对桶排序的优化,它将待排序元素分为若干块,分别进行插入排序,再将已排序块合并。

8种排序之折半插入排序

8种排序之折半插入排序

折半插入排序算法:也叫二分插入排序算法。

这种算法和直接插入算法基本一样。

都是属于插入排序。

所以时间复杂度为N2,空间复杂度为1.最好情况时间复杂度是n。

先看看这种算法思想。

折半插入算法与直接插入不同是:不是比的过程,那是插的过程。

二分排序想名字就是把有序的东西分成2半。

比如说你向1 2 3 4 5 6这个有序序列插入4,你怎么插,你可以先和6比,在和5比这样可以做。

但是作为一个有序序列你如果和中间比,如果比中间大就和后面那一部分比,然后后面又找中间部分。

在平均的情况下比直接插这比要快。

例如:有一个数要排列97 6 4 5 1 5 7第一趟排,就找第二个数看看和前一个数的大小,然后确定插入的位置7 96 4 5 1 5 7 后面同理6 7 94 5 1 5 74 6 7 95 1 5 74 5 6 7 91 5 71 4 5 6 7 9571 4 5 5 6 7 971 4 5 5 6 7 7 9看这个排序过程和直接插入排序一模一样只是代码实现上是不同的。

不同在向有序序列插入的过程。

大家看看实现代码:package com.fish.sort;public class MiddleInsertSort {public static void main(String[] args) {int[] array = new int[] { 9, 7, 6, 4, 5, 1, 5, 7 };myResult(array);}public static void myResult(int[] array) {for (int i = 1; i < array.length; i++) {// 比较当前数和前一个数的大小if (array[i] < array[i - 1]) {// 后一个数比前一个数小,就把后面的大数放一个交换区int swap = array[i];// 定义高低位是用来确定,前面有序序列的大小。

8086汇编实现冒泡排序、直接插入排序、折半查找

8086汇编实现冒泡排序、直接插入排序、折半查找

(2)直接插入法 直接插入排序:将一个数据插入到一个已排好序的数据中,主要步骤如下:
① 查找应该插入的位置,这个过程免不了要比较数据的大小; ② 找到位置后,需将这个位置以及其后的数据都向后移动一位,空出此位置,等待插入 ③ 插入数据。
其 C 语言版的代码如下:
for(int i=2;i<=100;i++)
DSEG SEGMENT SCORE DB 31H,02H,15H,4H,5H,6H,7H,8H,9H,10H,90 DUP(05H) MAX DB ? MIN DB ?
DSEG ENDS CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG START: MOV AX,DSEG
MOV DS,AX
;相当于 i
L2: MOV AL,[BX+DI] ; L2 为内循环,(DI)为循环变量,相当于 j
CMP AH,AL
JAE L3
MOV DH,AH
;AH<Al,交换两个数
MOV AH,AL
MOV AL,DH
MOV [BX+DI],AL ;将交换后的数存入存储器
MOV [BX+SI],AH ;这两步很重要
L4: MOV DL,[BX+DI] ;从内存中取出 a[j],给(DL)
CMP DH,DL
;比较 a[0]和 a[j]
JAE L5
;a[0]<a[j],向后移
MOV [BX+DI+1],DL ;存入内存,实现真正的后移
DEC DI
;j--
JMP L4
L5: MOV [BX+DI+1],DH ;a[0]>=a[j],a[0]—>a[j+1],实现直接插入
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法如下:
void BInsertSort(Record *arr, int length) // length是要排序的元素的个数,0号单元除外 { for (int i = 2; i <= length; ++i) { arr[0] = arr[i]; // 将arr[i]暂存到arr[0] int low = 1; int high = i - 1; while (low <= high) { // 在arr[low..high]中折半查找有序插入的位置 int m = (low + high) / 2; // 折半 if (arr[0].key < arr[m].key) // 关键字相同时,使low = m + 1,到高半区,保证稳定性 high = m - 1; // 插入点在低半区 else low = m + 1; // 插入点在高半区 } for (int j = i - 1; j >= high + 1; --j) arr[j + 1] = arr[j]; // 记录后移 arr[high + 1] = arr[0]; // 插入 } }
折半插入排序
binary insertion sort
基本概念
折半插入排序(binary insertion sort)是对插入排序算法的一种改 进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的 序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻 找插入点,可以采用折半查找的方法来加快寻找插入点的速度。
稳定性及复杂度
折半插入排序算法是一种稳定的排序算法,比直接插入算法明显 减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但 记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为 O(n^2),与直接插入排序算法相同。附加空间O(1)。
折半插入算法与直接插入不同是:
不是比的过程,那是插的过程。二分排序想名字就是把有序的东西分 成2半。比如说 你向1 2 3 4 5 6这个有序序列插入4,你怎么插,你 可以先和6比,在和5比这样可以做。但是作为一个有序序列你如果和 中间比,如果比中间大就和后面那一部分比,然后后面又找中间部分。 在平均的情况下比直接插这比要快。
具体操作
பைடு நூலகம்
在将一个新元素插入已排好序的数组的过程中,寻找插入点时, 将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比 较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元 素大,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择 a[m+1]到a[high]为新的插入区域(即low=m+1),如此直至 low<=high不成立,即将此位置之后所有元素后移一位,并将新元素 插入a[high+1]。
相关文档
最新文档