插入排序

插入排序
插入排序

Description

插入排序是一种十分常见的排序方法。其基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,是一种稳定的排序方法。请你结合数据结构所学知识,实现这种排序方法,并将每一轮的排序结果输出。

Input

第一行输入整数N(1<=n<=100)代表待排序的数据个数。

接下来一行中有N个整数,代表待排序的数据。

Output

第一行输出原始的数据顺序,接下来每一行输出一趟排序的结果(如果顺序没有改变则不输出),直至排序完成,从而实现数据的升序排列。

如果一开始的数据已经有序,则只输出原始数据。

注意,输出的每一个数字后面均带有一个空格。

Sample Input

Copy sample input to clipboard

5

78 24 13 2 99

Sample Output

78 24 13 2 99

24 78 13 2 99

13 24 78 2 99

2 1

3 2

4 78 99

#include

using namespace std;

bool IfChange(int* a, int* b, int n){

for (int i = 0;i < n;i++){

if (a[i] != b[i])

return true;

}

return false;

}

void sort(int* a, int* b, int n){

int pos1, pos2;

for (int i = 1;i < n;i++){

pos1 = i;

pos2 = i;

for (int j = 0;j < i;j++){

if (a[i] < a[j]){

pos1 = i;

pos2 = j;

break;

}

}

for (int j = 0;j < pos2;j++)

b[j] = a[j];

b[pos2] = a[pos1];

int pa = pos2;

int pb = pos2+1;

while (pb < n){

if (pa != pos1)

b[pb++] = a[pa++];

else

pa++;

}

if (IfChange(a,b,n)){

for (int j = 0;j < n;j++){

cout << b[j] << ' ';

}

cout << endl;

}

for (int j = 0;j < n;j++){

a[j] = b[j];

}

}

}

int main(){

int n, num;

cin >> n;

int a[n], b[n];

for (int i = 0;i < n;i++){

cin >> a[i];

cout << a[i] << ' ';

}

cout << endl;

sort(a,b,n);

return 0;

}

插入排序基本思想

.cnblogs./hegezhou_hot/archive/2009/05/06/1450788.html 插入排序基本思想 插入排序的基本思想:每次将一个待排序的记录,按其关键字的大小插入到前面已经排好序的子文件的适当位置,直到 全部的记录插入完成为止。 本节介绍二种插入排序方法:直接插入排序和希尔排序。 先介绍简单的一种插入排序方法:直接插入排序 直接插入排序基本思想: 直接插入排序 1、基本思想: 假设待排序的记录存放在R[1..n]数组中,初始时该数组R[1]自成有序区。无序区为R[2...n],从R[2...n]中的R[2]开始到R[n],依次将R[i]插入到有序区中,生成最终的有序区。

2、直接插入排序: 通常将一个记录R[i] 插入到当前有序区,使得插入后的仍保证区间里面的记录是有序的,该操作称为第i-1趟插入排序。 排序过程的某一个中间时刻,R被划分为二个子区,有序区和无序区,R[1...i-1]是已排好的有序区间,R[i...n]为无序区。 直接插入排序的基本操作是将当前无序区的第一个记录R[i] 插入到有序区中适当的位置上,使得R[1...i]变为新的有序 区。因为这种方法每次是的有序区增加一个记录,因此通常称为增量法。一趟直接插入排序方法 1、简单方法 首先在当前有序区中查找R[1...i-1]中R[i]应该插入的正确位置;然后将R[k...i-1]的记录均向后移动一个位置,腾出K位置上的空间插入R[i]。如果R[i]的关键字大于等于R[1...i-1]中的记录,那么R[i]插入到原位置。即i位置。 2、改进的方法

一种查找比较操作和记录移动操作交替进行的方法。 具体的做法: 将待插入的R[i]关键字从右向左依次与有序区中记录R[j]关键字进行比较(1

数据结构排序习题

07排序 【单选题】 1. 从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为(A)排序法。 A、直接插入 B、简单选择 C、希尔 D、二路归并 2. 直接插入排序在最好情况下的时间复杂度为(B)。 A、O(logn) B、O(n) C、O(n*logn) D、O(n2) 3. 设有一组关键字值(46,79,56,38,40,84),则用堆排序的方法建立的初始堆为(B)。 A、79,46,56,38,40,80 B、84,79,56,38,40,46 C、84,79,56,46,40,38 D、84,56,79,40,46,38 4. 设有一组关键字值(46,79,56,38,40,84),则用快速排序的方法,以第一个记录为基准得到的一次划分结果为(C)。 A、38,40,46,56,79,84 B、40,38,46,79,56,84 C、40,38,46,56,79,84 D、40,38,46,84,56,79 5. 将两个各有n个元素的有序表归并成一个有序表,最少进行(A)次比较。 A、n B、2n-1 C、2n D、n-1 6. 下列排序方法中,排序趟数与待排序列的初始状态有关的是(C)。 A、直接插入 B、简单选择 C、起泡 D、堆 7. 下列排序方法中,不稳定的是(D)。 A、直接插入 B、起泡 C、二路归并 D、堆 8. 若要在O(nlog2n)的时间复杂度上完成排序,且要求排序是稳定的,则可选择下列排序方法中的(C)。 A、快速 B、堆 C、二路归并 D、直接插入 9. 设有1000个无序的数据元素,希望用最快的速度挑选出关键字最大的前10个元素,最好选用(C)排序法。 A、起泡 B、快速 C、堆 D、基数 10. 若待排元素已按关键字值基本有序,则下列排序方法中效率最高的是(A)。 A、直接插入 B、简单选择 C、快速 D、二路归并 11. 数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中的(C)的两趟排序后的结果。 A、选择排序 B、冒泡排序 C、插入排序 D、堆排序 12. (A)占用的额外空间的空间复杂性为O(1)。 A、堆排序算法 B、归并排序算法 C、快速排序算法 D、以上答案都不对

常见经典排序算法(C语言)1希尔排序 二分插入法 直接插入法 带哨兵的直接排序法 冒泡排序 选择排序 快速排

常见经典排序算法(C语言) 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序 一.希尔(Shell)排序法(又称宿小增量排序,是1959年由D.L.Shell提出来的) /* Shell 排序法*/ #include void sort(int v[],int n) { int gap,i,j,temp; for(gap=n/2;gap>0;gap /= 2) /* 设置排序的步长,步长gap每次减半,直到减到1 */ { for(i=gap;i= 0) && (v[j] > v[j+gap]);j -= gap ) /* 比较相距gap远的两个元素的大小,根据排序方向决定如何调换*/ { temp=v[j]; v[j]=v[j+gap]; v[j+gap]=temp; } }

} } 二.二分插入法 /* 二分插入法*/ void HalfInsertSort(int a[], int len) { int i, j,temp; int low, high, mid; for (i=1; i temp) /* 如果中间元素比但前元素大,当前元素要插入到中间元素的左侧*/ { high = mid-1; } else /* 如果中间元素比当前元素小,但前元素要插入到中间元素的右侧*/ { low = mid+1; } } /* 找到当前元素的位置,在low和high之间*/ for (j=i-1; j>high; j--)/* 元素后移*/ { a[j+1] = a[j]; } a[high+1] = temp; /* 插入*/ } }

直接插入排序法C程序设计

插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫面,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后移动,为最新元素提供插入空间。 1#include 2#include "CreateData.c" //生成随机数的函数 3#define ARRAYLEN 10 //需要排序的数据元素数量 4 5void InsertSort(int a[], int n) 6{ 7 int i,j,t; 8 for(i=1;i=0 && t

20 for(i=0;i

数据结构第九章排序习题及答案

习题九排序 一、单项选择题 1.下列内部排序算法中: A.快速排序 B.直接插入排序 C. 二路归并排序 D. 简单选择排序 E. 起泡排序 F. 堆排序 (1)其比较次数与序列初态无关的算法是() (2)不稳定的排序算法是() (3)在初始序列已基本有序(除去n个元素中的某k个元素后即呈有序,k<

数据结构习题汇编09第九章排序试题

数据结构课程(本科)第九章试题 一、单项选择题 1.若待排序对象序列在排序前已按其排序码递增顺序排列,则采用()方法比较次数最少。 A. 直接插入排序 B. 快速排序 C. 归并排序 D. 直接选择排序 2.如果只想得到1024个元素组成的序列中的前5个最小元素,那么用()方法最快。 A. 起泡排序 B. 快速排序 C. 直接选择排序 D. 堆排序 3.对待排序的元素序列进行划分,将其分为左、右两个子序列,再对两个子序列施加同样的排序操作, 直到子序列为空或只剩一个元素为止。这样的排序方法是()。 A. 直接选择排序 B. 直接插入排序 C. 快速排序 D. 起泡排序 4.对5个不同的数据元素进行直接插入排序,最多需要进行()次比较 A. 8 B. 10 C. 15 D. 25 5.如果输入序列是已经排好顺序的,则下列算法中()算法最快结束 A. 起泡排序 B. 直接插入排序 C. 直接选择排序 D. 快速排序 6.如果输入序列是已经排好顺序的,则下列算法中()算法最慢结束 A. 起泡排序 B. 直接插入排序 C. 直接选择排序 D. 快速排序 7.下列排序算法中()算法是不稳定的。 A. 起泡排序 B. 直接插入排序 C. 基数排序 D. 快速排序 8.假设某文件经过内部排序得到100个初始归并段,那么如果要求利用多路平衡归并在3 趟内完成排序, 则应取的归并路数至少是()。 A. 3 B. 4 C. 5 D. 6 9.采用任何基于排序码比较的算法,对5个互异的整数进行排序,至少需要()次比较。 A. 5 B. 6 C. 7 D. 8 10.下列算法中()算法不具有这样的特性:对某些输入序列,可能不需要移动数据对象即可完成 排序。 A. 起泡排序 B. 希尔排序 C. 快速排序 D. 直接选择排序

C语言冒泡、插入法、选择排序算法

C语言中三种常见排序算法分析 一、冒泡法(起泡法) 算法要求:用起泡法对10个整数按升序排序。 算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。 算法源代码: # include main() { int a[10],i,j,t; printf("Please input 10 numbers: "); /*输入源数据*/ for(i=0;i<10;i++) scanf("%d",&a[i]); /*排序*/ for(j=0;j<9;j++) /*外循环控制排序趟数,n个数排n-1趟*/ for(i=0;i<9-j;i++) /*内循环每趟比较的次数,第j趟比较n-j次*/ if(a[i]>a[i+1]) /*相邻元素比较,逆序则交换*/ { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } /*输出排序结果*/ printf("The sorted numbers: "); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); } 算法特点:相邻元素两两比较,每趟将最值沉底即可确定一个数在结果的位置,确定元素位置的顺序是从后往前,其余元素可能作相对位置的调整。可以进行升序或降序排序。 算法分析:定义n-1次循环,每个数字比较n-j次,比较前一个数和后一个数的大小。然后交换顺序。二、选择法 算法要求:用选择法对10个整数按降序排序。 算法分析:每趟选出一个最值和无序序列的第一个数交换,n个数共选n-1趟。第i趟假设i为最值下标,然后将最值和i+1至最后一个数比较,找出最值的下标,若最值下标不为初设值,则将最值元素和下标为i的元素交换。 算法源代码: # include main() { int a[10],i,j,k,t,n=10; printf("Please input 10 numbers:");

排列组合--插板法、插空法、捆绑法

排列组合问题——插板法(分组)、插空法(不相邻)、捆绑法(相邻) 插板法(m为空得数量) 【基本题型】 有n个相同得元素,要求分到不同得m组中,且每组至少有一个元素,问有多少种分法? 图中“"表示相同得名额,“”表示名额间形成得空隙,设想在这几个空隙中插入六块“挡板",则将这10 个名额分割成七个部分,将第一、二、三、……七个部分所包含得名额数分给第一、二、三……七所学校,则“挡板"得一种插法恰好对应了10 个名额得一种分配方法,反之,名额得一种分配方法也决定了档板得一种插法,即挡板得插法种数与名额得分配方法种数就是相等得, 【总结】?需满足条件:n个相同元素,不同个m组,每组至少有一个元素,则只需在n个元素得n-1个间隙中放置m-1块隔板把它隔成m份即可,共有种不同方法。? 注意:这样对于很多得问题,就是不能直接利用插板法解题得。但,可以通过一定得转变,将其变成符合上面3个条件得问题,这样就可以利用插板法解决,并且常常会产生意想不到得效果。 插板法就就是在n个元素间得(n—1)个空中插入若干个(b)个板,可以把n个元素分成(b+1)组得方法. 应用插板法必须满足三个条件: (1) 这n个元素必须互不相异 (2)所分成得每一组至少分得一个元素?(3)分成得组别彼此相异 举个很普通得例子来说明 把10个相同得小球放入3个不同得箱子,每个箱子至少一个,问有几种情况? 问题得题干满足条件(1)(2),适用插板法,c9 2=36 ?下面通过几道题目介绍下插板法得应用 e二次插板法?例8:在一张节目单中原有6个节目,若保持这些节目相对次序不变,再添加3个节目,共有几种情况??-o — o -o-o -o—o —三个节目abc 可以用一个节目去插7个空位,再用第二个节目去插8个空位,用最后个节目去插9个空位 所以一共就是c71×c81×c9 1=504种 【基本解题思路】 将n个相同得元素排成一行,n个元素之间出现了(n-1)个空档,现在我们用(m—1)个“档板”插入(n-1)个空档中,就把n个元素隔成有序得m份,每个组依次按组序号分到对应位置得几个元素(可能就是1个、2个、3个、4个、…。),这样不同得插入办法就对应着n个相同得元素分到m组得一种分法,这种借助于这样得虚拟“档板”分配元素得方法称之为插板法。

排序算法C语言版:直接插入排序

直接插入排序 算法思想简单描述: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 直接插入排序是稳定的。算法时间复杂度O(n^2) 算法实现: /* 功能:直接插入排序 输入:数组名称(也就是数组首地址)、数组中元素个数 */ void insert_sort(int *x, int n) { int i, j, t; for (i=1; i

*/ t=*(x+ I ); for (j=i-1; j>=0 && t<*(x+j); j--) /*注意:j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。*/ { *(x+j+1) = *(x+ j ); /*如果满足条件就往后挪。最坏的情况就是t比下标为0的数都小,它要放在最前面,j==-1,退出循环*/ } *(x+j+1) = t; /*找到下标为i的数的放置位置*/ } }

#include "stdio.h" #include "conio.h" main() { int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j; printf("original array is:\n"); for(i=0;i<10;i++) printf("%5d",a[i]); printf("\n"); printf("insert a new number:"); scanf("%d",&number); end=a[9]; if(number>end) a[10]=number; else { for(i=0;i<10;i++) { if(a[i]>number) { temp1=a[i]; a[i]=number; for(j=i+1;j<11;j++) { temp2=a[j]; a[j]=temp1; temp1=temp2; } break; } } } for(i=0;i<11;i++) printf("%6d",a[i]); getch();

折半插入排序

折半插入排序 描述 用函数实现折半插入排序,并输出每趟排序的结果. Input 第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据Output 每行输出一趟排序结果,数据之间用一个空格分隔 #include"stdio.h" #define MAXSIZE 20//一个用作示例的小顺序表的最大长度typedef int KeyType;//定义关键字类型为整数类型 typedef struct { int key; float info; }JD; void bsort(JD r[],int n) {//作折半插入排序 int i,j,low,high,mid; for(i=2;i<=n;i++) { r[0]=r[i]; //r[0]用作哨兵单元 low=1;high=i-1; while(low<=high) //在r[low...high]中折半查找插入的位置 { mid=(low+high)/2; //折半 if(r[0].key

while(j>=high+1) { r[j+1]=r[j]; //记录后移 --j; }//while r[high+1]=r[0]; //插入到正确位置 for(j=1;j<=n;j++) //输出每趟排序的结果 { printf("%d ",r[j].key); }//for printf("\n"); }//for }//straisort void main() { int n,i; //待排序的关键字个数 JD r[MAXSIZE]; scanf("%d",&n); for(i=1;i<=n;i++)//输入待排序的关键字 scanf("%d",&r[i].key); bsort(r,n); }

数据结构复习题

//八大排序: (插入排序):1直接插入排序 2希尔排序 (交换排序):3冒泡排序 4快速排序:寻找中点,对左右递归排序 (选择排序):5简单选择排序 6堆排序 7归并排序 8基数排序 习题一 1.在数据结构中,数据的基本单位是_________。 A. 数据项 B. 数据类型 C. 数据元素 D. 数据变量 2. 计算算法的时间复杂度是属于一种_______。 A. 事前统计的方法 B. 事前分析估算的方法 C. 事后统计的方法 D. 事后分析估算的方法 3. 线性表若采用链式存储结构时,要求内存中可用存储单元的地址_______。 A. 必须是连续的 B. 部分地址必须是连续的 C. 一定是不连续的 D. 连续不连续都可以 4. 在顺序表存储结构下,插入操作算法。 A. 需要判断是否表满 B. 需要判断是否表空 C. 不需要判断表满 D. 需要判断是否表空和表满 5. 在一个单链表中,若删除p所指结点的后继结点,则执行。 A. p.next = p.next.next; B. p.next = p.next; C. p = p.next.next; D. p = p.next; p.next = p.next.next; 6. 若线性表最常用的操作是存取第i个元素及其前趋和后继元素的值,为节省时间应采用的存储方式是。 A. 单链表 B. 双向链表 C. 单循环链表 D. 顺序表 7. 在初始为空的堆栈中依次插入元素f,e,d,c,b,a以后,进行一次删除操作后,此时栈顶元素是。 A. c B.d C.b D. e 8. 栈和队列的共同点是。 A. 都是先进后出 B. 都是先进先出 C. 只允许在端点处插入和删除元素 D. 没有共同点 9. 判定一个循环队列QU(最多元素为m0)为满队列的条件是。 A. QU.front==QU.rear B. QU.front!=QU.rear C. QU.front==(QU.rear+1) % m0 D. QU.front!=(QU.rear+1) % m0 10.以下说法错误的是。 A.树形结构的特点是一个结点可以有多个直接前趋 B.线性结构中的一个结点至多只有一个直接后继 C.树形结构可以表达(组织)更复杂的数据 D.树(及一切树形结构)是一种"分支层次"结构 11. 如下图所示的4 棵二叉树中,不是完全二叉树。 12. 深度为5 的二叉树至多有个结点。//设深度为k (2^k)-1 A. 16 B. 32 C.31 D.10

排列组合的方法捆绑法-插空法和插板法

“相邻问题”捆绑法,即在解决对于某几个元素要求相邻的问题时,先将其“捆绑”后整体考虑,也就是将相邻元素视作“一个”大元素进行排序,然后再考虑大元素内部各元素间排列顺序的解题策略。 例1.若有A、B、C、D、E五个人排队,要求A和B两个人必须站在相邻位置,则有多少排队方法? 【解析】:题目要求A和B两个人必须排在一起,首先将A和B两个人“捆绑”,视其为“一个人”,也即对“A,B”、C、D、E“四个人”进行排列,有种排法。又因为捆绑在一起的A、B两人也要排序,有种排法。根据分步乘法原理,总的排法有种。 例2.有8本不同的书,其中数学书3本,外语书2本,其它学科书3本。若将这些书排成一列放在书架上,让数学书排在一起,外语书也恰好排在一起的排法共有多少种? 【解析】:把3本数学书“捆绑”在一起看成一本大书,2本外语书也“捆绑”在一起看成一本大书,与其它3本书一起看作5个元素,共有种排法;又3本数学书有种排法,2本外语书有种排法;根据分步乘法原理共有排法种。 【王永恒提示】:运用捆绑法解决排列组合问题时,一定要注意“捆绑”起来的大元素内部的顺序问题。解题过程是“先捆绑,再排列”。 “不邻问题”插空法,即在解决对于某几个元素要求不相邻的问题时,先将其它元素排好,再将指定的不相邻的元素插入已排好元素的间隙或两端位置,从而将问题解决的策略。 例3.若有A、B、C、D、E五个人排队,要求A和B两个人必须不站在一起,则有多少排队方法? 【解析】:题目要求A和B两个人必须隔开。首先将C、D、E三个人排列,有种排法;若排成D C E,则D、C、E“中间”和“两端”共有四个空位

置,也即是:︺ D ︺ C ︺ E ︺,此时可将A、B两人插到四个空位置中的任意两个位置,有种插法。由乘法原理,共有排队方法: 。 例4.在一张节目单中原有6个节目,若保持这些节目相对顺序不变,再添加进去3个节目,则所有不同的添加方法共有多少种? 【解析】:直接解答较为麻烦,可根据插空法去解题,故可先用一个节目去插7个空位(原来的6个节目排好后,中间和两端共有7个空位),有种方法;再用另一个节目去插8个空位,有种方法;用最后一个节目去插9个空位,有方法,由乘法原理得:所有不同的添加方法为=504种。 例4.一条马路上有编号为1、2、……、9的九盏路灯,为了节约用电,可以把其中的三盏关掉,但不能同时关掉相邻的两盏或三盏,则所有不同的关灯方法有多少种? 【解析】:若直接解答须分类讨论,情况较复杂。故可把六盏亮着的灯看作六个元素,然后用不亮的三盏灯去插7个空位,共有种方法(请您想想为什么不是),因此所有不同的关灯方法有种。 【王永恒提示】:运用插空法解决排列组合问题时,一定要注意插空位置包括先排好元素“中间空位”和“两端空位”。解题过程是“先排列,再插空”。 练习:一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添加进去2个新节目,有多少种安排方法?(国考2008-57) A.20 B.12 C.6 D.4 插板法是用于解决“相同元素”分组问题,且要求每组均“非空”,即要求每组至少一个元素;若对于“可空”问题,即每组可以是零个元素,又该如何解题呢?下面先给各位考生看一道题目:

直接插入排序

#include using namespace std; void insert_sort(int a[],int length) { int t; for(int i=0;i=0&&a[j]>t;j--) { a[j+1]=a[j]; //把比t大(a[j]>t)的元素,全部后移一个位置 } a[j+1]=t; //把待排序的t插入到a[j+1].完成插入排序过程。 } } int main() { int a[5]={12,5,41,36,89}; insert_sort(a,5); for(int i=0;i<5;i++) cout< using namespace std; #define MAXSIZE 20 //定义顺序表的最大长度 //定义顺序表的存储结构 typedef int KeyType; //定义关键字为整数类型typedef struct { KeyType key; //关键字项 } RedType; //记录类型 typedef struct { RedType r[MAXSIZE+1]; //r[0]用作哨兵单元 int length; //顺序表长度 } SqList; //顺序表类型 //函数原型声明 void InitiSeqList(SqList &L, int n); //初始化顺序表函数

数据结构练习(答案)

数据结构练习 1.填写下面表格,对以下几种排序方法进行比较: 2.具有N个元素的顺序存储的循环队列中,假定front和rear分别指向队头元素的前一位置和队尾元素的位置,则判断队空的和队满的条件分别是f=r 和 f=r mod m +1。求此队列中元素个数的计算公式为: ((r+m)-f-1) mod m +1。 入队运算:r:=r mod m+1。 出队运算:f:=f mod m + 1。 3.单链表是非顺序线性的链式存储结构,链栈和链队分别是和的链式存储结构。 4.线性表的顺序存储中,元素之间的逻辑关系是通过元素存储地址次序决定的,在线性表的链接存储中,元素之间的逻辑关系是通过元素存储指针地址 访问决定的。 5.深度为5的二叉树至多有结点数为31。 6.数据结构即数据的逻辑结构包括顺性存储结构、链式存储结构、非线性结构三种类型,树型结构和图型结构称为非线性结构。 ??? 四种基本存储方法:(1)顺序存储方法(2)链接存储方法(3)索引存储方法(4)散列存储方法二.选择题

1.有一个10阶对称矩阵,采用压缩存储方式,以行序为主序存储,A[0][0]的地址为1,则A[7][4]的地址为( C ) A 13 B. 18 C. 33 D. 40 2.线性表采用链表存储时其存储地址 D 。 A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续不连续都可以 3.下列叙述中错误的是 C 。 A.串是一种特殊的线性表,其特殊性体现在数据元素是一个字符 B.栈和队列是两种特殊的线性表,栈的特点是后进先出,队列的特点是先进先出。 C.线性表的线性存储结构优于链式存储结构 D.二维数组是其数据元素为线性表的线性表 4.一棵二叉树的顺序存储结构如题图4-1所示,若中序遍历该二叉树,则遍历次序为 A . A. DBEGACFH B. ABDEGCFH C. DGEBHFCA D. ABCDEFGH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 题图4-1 5.设一棵二叉树的顺序存储结构如题图4-2所示,则该二叉树是 C . A.完全二叉树 B.满二叉树 C.深度为4 的二叉树 D.深度为3的二叉树 1 2 3 4 5 6 7 8 9 10 11 题图4-2 6.设T是Huffman树,它具有6个树叶,且各树叶的权分别为1,2,3,4,5,6。 那么该树的非叶子结点的权之和为A。 A.51 B.21 C.30 D.49 7.设有一无向图的邻接矩阵如下所示,则该图所有顶点的度之和为C。 a b c d e a 0 1 1 1 0 b 1 0 1 0 1 c 1 1 0 0 0 d 1 0 0 0 0 e 0 1 0 0 0

折半插入排序(C语言版)

折半查找插入排序 1.实验目的 本实验将通过实验实例和程序设计练习,达到如下目的: 通过实验掌握二分排序的基本概念,掌握二分排序的基本思想和算法实现。 2.实验内容 本实验的内容包括: 设计一个算法用二分查找实现插入排序的“寻找插入位置”操作。 3.实验要求 二分查找:在有序表中进行,先确定表的中点位置,再通过比较确定下一步查找哪个半区。 以下是我根据严蔚敏教材数据结构(C语言版)自己编写的程序,在程序运行时根据提示随便输入一组数,并以-1结束,程序在TC2.01版本上运行无误, #include #define MAX 100 typedef struct { int elem[MAX]; int length; }SSTable; void BInsertSort(SSTable *L); int main(){ int m,i=1,a,k; SSTable ST; printf("Please input those numbers and press \"-1\" to end!\n"); scanf(" %d",&a); while(a!=-1){ ST.elem[i++]=a; scanf(" %d",&a); } ST.length=i-1; BInsertSort(&ST); printf("The result is:\n"); for(m=1;m<=ST.length;m++) printf(" %5d",ST.elem[m]); getch(); } void BInsertSort(SSTable *L){ int i,low,high,m,j; for(i=2;i<=(L->length);++i){ (*L).elem[0]=(*L).elem[i]; low=1;high=i-1; while(low<=high){

数据结构习题精编:排序

数据结构习题精编:排序 一、选择题 1.下列排序方法中,稳定的排序方法是 A.堆排序B.希尔排序C.快速排序D.直接插入排序2.下列排序方法中,不稳定的排序方法是 A.冒泡排序B.归并排序C.直接插入排序D.简单选择排序3.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是 A.堆排序B.归并排序C.快速排序D.直接插入排序4.当待排序序列中记录数较少或基本有序时,最适合的排序方法为 A.堆排序B.归并排序C.快速排序D.直接插入排序5.下列排序方法中,不能保证每趟排序后至少能将一个元素放到其最终的位置上的是A.堆排序B.希尔排序C.冒泡排序D.快速排序 6.下列排序方法中,最好与最坏时间复杂度不相同的排序方法是 A.堆排序B.冒泡排序C.归并排序D.直接选择排序7.下列排序方法中,排序过程中关键字的比较次数与记录初始排列无关的是A.堆排序B.快速排序C.简单选择排序D.直接插入排序8.堆排序平均执行的时间复杂度和需要附加的存储空间复杂度分别是 A.O(nlog2n)和O(1)B.O(n2)和O(1) C.O(nlog2n)和O(n)D.O(n2)和O(n) 9.直接插入排序在最好情况下的时间复杂度为 A.O(log2n)B.O(n)C.O(nlog2n)D.O(n2) 10.如果在排序过程中,每次均将一个待排序的记录按关键字大小加入到前面已经有序的子表中的适当位置,则该排序方法称为 A.堆排序B.归并排序C.插入排序D.冒泡排序11.如果在排序过程中,每次从未排序的记录中挑出最小(或最大)关键字的记录,加入到已排序记录的末尾,该排序方法是 A.堆排序B.冒泡排序C.直接插入排序D.简单选择排序12.在采用下列某种排序方法进行排序时,出现这样一个情况:在最后一趟开始之前,所有元素都不在其最终的位置上。该排序方法是 A.堆排序B.冒泡排序C.快速排序D.直接插入排序13.在待排序数据已有序时,花费时间反而最多的排序方法是 A.堆排序B.冒泡排序C.快速排序D.希尔排序14.设某数据表中有10000个无序的元素,如果仅要求选出其中最大的10个元素,最好采用的排序方法为 A.堆排序B.快速排序C.冒泡排序D.直接选择排序15.下列排序方法中,需要辅助存储空间为O(n)的是 A.堆排序B.希尔排序C.快速排序D.归并排序16.借助于“比较”进行排序的算法在最坏情况下能达到的最好时间复杂度为A.O(log2n)B.O(n)C.O(nlog2n)D.O(n2)

隔板法、插入法、捆绑法解决组合问题

1 10.3 组合六教学目标: 1掌握组合数的性质并能应用组合数的性质解题. 2培养学生应用公式、性质的能力. 教学重点: 隔板法、插入法、捆绑法解决组合问题. 教学难点: 隔板法、插入法、捆绑法. 教学过程: 讲授新课例1有10个相同的小球放入编号为1、2、3的三个不同盒子?7?6要求每个盒子非空共有多少种放法?7?7要求每个盒子放入的小球数不少于盒子的编号数共有多少种放法方法一:?7?6设xyz10 x≥y≥z 其正整数解为x8y1z1x7y2z1 x6y3z1x6y2z2 x5y4z1x5y3z2 x4y4z2x4y3z3 则放法有:.36443313AA ?7?7先将1个、2个小球分别放入第2、3个盒子再按?7?6放入每个盒子的小球数gt 0 设xyz7 x≥y≥z 其正整数解为 x5y1z1x4y2z1 x3y3z1x3y2z2 则放法有:.1533313AA 方法二隔板法.如: 对应: ?7?63629C ?7?71526C 答:?6?7 练习1.某中学从高中7个班中选出12名学生组成校代表队参加市中学数学应用题竞赛活动使代表中每班至少有1人参加的选法有多少种611C462 练习2. 6人带10瓶汽水参加春游每人至少带1瓶汽水共有多少种不同的带法12659C 练习3.北京市某中学要把9台型号相同的电脑送给西部地区的三所希望小学每所小学至少得到2台共有种不同送法. 例2. 已知方程xyzw100求这个方程的正整数解的组数. 练习4. 已知方程x1x2x350求这个方程有多少组非负整数解. 1号2号3号1号2号3号1号2号3号2 隔板法就是把“”当成隔板把考

数据结构排序部分练习题

一、单选题 12.设有5000个无序的元素,希望用最快的速度挑选出其中前50个最大的元素,最好选用( )法。A.冒泡排序B.快速排序C.堆排序D.归并排序 1.已知持排序的n个元素可分为n/k个组,每个组包含k个元素,各组间分块有序,若采用基于比较的排序,其时间下界应为:( ) A.O(nlog2n) B.O(nlog2k) C.O(klog2n) D.O(klog2k) )且稳定的排序方法是( )。 2.最好和最坏时间复杂度均为O(n nlog 2 A.快速排序B.堆排序C.归并排序D.基数排序 3.下列排序算法中,当初始数据有序时,花费时间反而最多的是( )。 A.起泡排序B.希尔排序C.堆排序D.快速排序 4.若需在O(nlog2n)的时间内完成排序,且要求稳定,则可选择() A.快速排序B.堆排序C.归并排序D.直接插入排序 5.排序趟数与序列的原始状态有关的排序方法是( )排序法。 A.插入B.选择C.希尔D.快速 6.已知数据表每个元素距离其最终位置不远,则最省时间的排序算法是( )。 A.堆排序B.直接插入排序C.快速排序D.直接选择排序 7.关键字比较次数与数据的初始状态无关的排序算法是( )。 A.直接选择排序B.冒泡排序C.直接插入排序D.希尔排序 8. 若一个元素序列基本有序,则选用()方法较快。 A.直接插入排序B.直接选择排序C.堆排序D.快速排序 9. 若要从1000个元素中得到4个最小值元素,最好采用()方法。 A.直接插入排序B.直接选择排序C.堆排序D.快速排序 10. 若要对1000个元素排序,要求既快又稳定,则最好采用()方法。 A.直接插入排序B.归并排序C.堆排序D.快速排序 11. 若要对1000个元素排序,要求既快又节省存储空间,则最好采用()方法。 A.直接插入排序B.归并排序C.堆排序D.快速排序 12. 在下列排序方法中,空间复杂性为O(log2n)的方法为()。 A.直接选择排序B.归并排序C.堆排序D.快速排序 13. 在平均情况下速度最快的排序方法为()。 A.直接选择排序B.归并排序C.堆排序D.快速排序 14、设有关键字初始序列{Q,H,C,Y,P,A,M,S,R,D,F,X},则用下列哪种排序方法进行第一趟扫描的结果为{F,H,C,D,P,A,M,Q,R,S,Y,X}? A.直接插入排序B.二路归并排序 C.以第一元素为基准的快速排序D.基数排序 15.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为( )排序法。 A.插入B.选择C.希尔D.二路归并 16.下面排序法中,( )排序法是不稳定的。 A.插入B.冒泡C.二路归并D.堆 17.下列排序方法中,不稳定的是() A.直接插入排序B.冒泡排序C.归并排序D.直接选择排序 18. 在直接插入排序的第i趟排序前,有序表中的元素个数为()。 A.i B.i+1 C.i-1 D.1 19. 在直接插入排序的第i趟排序时,为寻找插入位置最多需要进行()次元素的比较,假定第0号元

起泡、直接插入排序、 简单选择排序、快速排序、希尔排序和堆排序

实验八: 排序的基础实验 完成起泡、直接插入排序、简单选择排序、快速排序、希尔排序和堆排序中的三种排序方法,写成函数的形式 程序代码如下: #include"stdafx.h" #include #include #include typedef struct { int elem; }num; void print(num *L,int n) { int i; for(i=1;i<=n;i++) printf("%6d",L[i].elem); printf("\n"); } void binsertsort(num *L,int n)//插入排序

{ int i,m,j,low,high; for(i=2;i<=n;i++) { L[0]=L[i]; low=1; high=i-1; while(low<=high) { m=(low+high)/2; if(L[0].elem=high+1;j--) L[j+1]=L[j]; L[high+1]=L[0]; } } void bubble(num *L,int n)//起泡排序{

int i,j,t; for(i=1;iL[j].elem)

相关文档
最新文档