交换A[j]和A[j+1];
lastExchange=j;
}
i=lastExchange;//将i置为最后交换的位置
}//endwhile
}//BubbleSort
8.18 改写快速排序算法,要求采用三者取中的方式选择划分的基准记录;若当前被排序的区间长度小于等于3时,无须划分而是直接采用直接插入方式对其排序。
8.19 对给定的j(1≤j≤n ),要求在无序的记录区R[1..n]中找到按关键字自小到大排在第j个位置上的记录(即在无序集合中找到第j个最小元),试利用快速排序的划分思想编写算法实现上述的查找操作。
8.20`以单链表为存储结构,写一个直接选择排序算法。
8.21 写一个heapInsert(R,key)算法,将关键字插入到堆R中去,并保证插入R后仍是堆。提示:应为堆R增加一个长度属性描述(即改写本章定义的SeqList类型描述,使其含有长度域);将key先插入R中已有元素的尾部(即原堆的长度加1的位置,插入后堆的长度加1),然后从下往上调整,使插入的关键字满足性质。请分析算法的时间。
8.22 写一个建堆算法:从空堆开始,依次读入元素调用上题中堆插入算法将其插入堆中。
8.23 写一个堆删除算法:HeapDelete(R,i),将R[i]从堆中删去,并分析算法时间,提示:先将R[i]和堆中最后一个元素交换,并将堆长度减1,然后从位置i开始向下调整,使其满足堆性质。
8.24 已知两个单链表中的元素递增有序,试写一算法将这两个有序表归并成一个递增有序的单链表。算法应利用原有的链表结点空间。
8.25 设向量A[0..n-1]中存有n个互不相同的整数,且每个元素的值均在0到n-1之间。试写一时间为O(n)的算法将向量A排序,结果可输出到另一个向量B[0..n-1]中。
*8.26 写一组英文单词按字典序排列的基数排序算法。设单词均由大写字母构成,最长的单词有d个字母。提示:所有长度不足d个字母的单词都在尾处补足空格,排序时设置27个箱子,分别与空格,A,B...Z对应。
例题1、
下面的排序算法中,初始数据集的排列顺序对算法的性能无影响的是(B)
A、二分插入排序
B、堆排序
C、冒泡排序
D、快速排序
例题2、
写出下列算法的时间复杂度。
(1)冒泡排序;(2)选择排序;(3)插入排序;(4)二分插入排序;(5)快速排序;(6)堆排序;(7)归并排序
例题1、
写出希尔排序算法程序,并说明最坏的情况下需要进行多少次的比较和交换。
程序略,需要O(n^2)次的比较
例题2、
设要将序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的关键码按字母序的升序重新排列,则:冒泡排序一趟扫描的结果是H, C, Q, P, A, M, S, R, D, F, X ,Y;
初始步长为4的希尔(shell)排序一趟的结果是P, A, C, S, Q, D, F, X , R, H,M, Y ;
二路归并排序一趟扫描的结果是H, Q, C, Y,A, P, M, S, D, R, F, X;
快速排序一趟扫描的结果是F, H, C, D, P, A, M, Q, R, S, Y,X;
堆排序初始建堆的结果是 A, D, C, R, F, Q, M, S, Y,P, H, X。
例题1、
在插入和选择排序中,若初始数据基本正序,则选用插入排序(到尾部);若初始数据基本反序,则选用选择排序。
例题2、
下述几种排序方法中,平均查找长度(ASL)最小的是
A. 插入排序B.快速排序C. 归并排序D. 选择排序
例题1、
对于整数序列100,99,98,…3,2,1,如果将它完全倒过来,分别用冒泡排序,它们的比较次数和交换次数各是多少?
答:冒泡排序的比较和交换次数将最大,都是1+2+…+n-1=n(n-1)/2=50×99=4545次。
例题2、
把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。
事实上,这道题放到冒泡排序这里不知道是不是特别合适,只是有一种解法是类似冒泡的思想,如下解法一
解法一、
每次遇到大写字母就往后冒,最后结果即为所求
[cpp]view plaincopy
1.#include
2.#include
3.//题目以及要求:把一个字符串的大写字母放到字符串的后面,
4.//各个字符的相对位置不变,不能申请额外的空间。
5.//判断是不是大写字母
6.int isUpperAlpha(char c){
7.if(c >= 'A' && c <= 'Z'){
8.return 1;
9.}
10.return 0;
11.}
12.//交换两个字母
13.void swap(char *a, char *b){
14.char temp = *a;
15.*a = *b;
16.*b = temp;
17.}
18.char * mySort(char *arr, int len){
19.if(arr == NULL || len <= 0){
20.return NULL;
21.}
22.int i = 0, j = 0, k = 0;
23.for(i = 0; i < len; i++){
24.for(j = len - 1 - i; j >= 0; j--){