交换排序与归并排序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

68 32
47 74
56 83
low low high
左侧小数序列R [s]~R [low-1], 即R [0]~R [4] 右侧大数序列R [high+1]~R [e] ,即R [6]~R [7]
void QuickSort(DataType R[], int s, int e) { int low=s, high=e; //本次划分的低、高端指针 DataType x=R[s]; //x暂存枢轴元素 while(low < high ){ //内循环①从右到左查找比枢轴小的元素 while(low < high && A[high].key>=x.key) high--; R[low]=R[high]; //将小数放在左侧小数序列中

快速排序
算法思想
通过一趟排序选定一个关键字介于“中间”的 记录,从而使剩余记录可以分成两个子序列分 别继续排序,通常称该记录为“枢轴”。 例如:序列{ 68, 39, 65, 83, 74, 32, 47, 56 },经 过一次快速排序后根据第一个元素“68”可划分 为{ 56, 39, 65, 47, 32, 68, 74, 83 },此时, “68” 被称为“枢轴”。
74
32
47
83 56
high high
枢轴 x=68
68 56
39
65
wk.baidu.com
47 83
74
32
47 74
56 83
low low
68 56 39 65 47 83 32 74 low
0 1 2 3 4
high 32 47 74 56 83
high high
5 6 7
68 56
39
65
47 83
32 74
//内循环②从左到右查找比枢轴大或相等的元素
while(low < high && R[low].key<x.key) low++ ; R[high] = R[low]; //将大数放在右侧大数序列中 } //循环结束时low、high重合 R[low]=x; //确定枢轴的最终存放位置 if(s< high-1) QuickSort(R,s,high-1); //对左侧小数序列进行递归划分 if(high+1 <e) QuickSort(R, high+1,e); //对右侧大数序列进行递归划分
冒泡排序
假设数据元素存放于数组L中。初始时,有序区
为空,无序区为L[0]~L[n-1]。在无序区中,每次 均从后向前依次比较相邻的两个数据元素L[j]与 L[j-1],若存在逆序(即L[j]<L[j-1]),则交换 二者的位置。每执行这一个过程称为一趟冒泡排 序。结果关键字最小的记录被安置在最前一个记 录上。 对后n-1个记录进行第二趟冒泡排序,结果使关 键字次小的记录被安置在第2个记录位置 重复上述过程,直到“在一趟排序过程中没有进 行过交换记录的操作”为止 冒泡排序flash演示
实际应用中枢轴元素的选定有多种方法,而选 定第一个元素作为枢轴只是其中之一。
基本思想:设数据元素存放于数组R中,当前序列为 R[start]~R [end],star和end分别为序列的上、下界。

一次划分:选序列的第一个元素R [start](称为枢轴) 作为基准元素x。设置变量low和high,初始时分别指 向序列的两端s和e。low和high依次从序列的两端交替 向序列中央扫描,将小于x的元素移到枢轴的左边,将 大于等于x的元素均移到枢轴的右边,这样经过一趟快 速排序之后,序列就被基准元素x划分为左、右两个子 序列R [start]~R [low-1]和R [high+1]~R [end],并且左 端子序列中所有数据元素均小于枢轴,右边的子序列 中所有数据元素均大于等于枢轴。 重复以上划分过程,直至序列被划分为只含有1个数据 元素的子序列为止,此时整个序列有序。
交换两个记录,使排序码较小的元素逐渐从 后部移向前部(从下标较大的单元移向下标 较小的单元,排序码最小的记录有如气泡一 般逐渐向上漂浮至水面。 优点: 每趟结束时,不仅能挤出一个最小值到最前 面位置,还能同时部分理顺其他元素(各元 素不断接近自己的位置);一旦下趟没有交 换发生,还可以提前结束排序。
void BubbleSort(DataType L[],int len) { int i,j,exchange; //exchange为是否发生交换的标志 DataType tmp; for(i=0; i<n-1; i++) //最多n-1趟排序 { exchange=0; for(j=n-1; j>i; j--) //一趟冒泡排序 if(L[j].key<L[j-1].key) //逆序则交换 { tmp=L[j]; L[j]=L[j-1]; L[j-1]=tmp; exchange=1; //发生了交换,不能结束排序 } if(exchange==0) break; //如果不再发生交换则排序结束 }

初始:s=0, e=7, low=0, high=7
0 1 2 3 4 5 6
枢轴 x=68
7
序列: 68
low
39
65
83
74
32
47
56
high
68 56
low 68 56
39
65
83
74
32
47
56
high
39
65
83 low
74
32
47
83 56 high
low
68 56 39 65
47 83 low
交换排序与 归并排序
交换排序
基本思想:对待排序数据元素,两两比较其关
键字,若发现存在逆序(两个关键字按非递增 次序排列),则交换这两个数据元素,一直到 待排序数据元素序列中没有逆序为止。 常用的交换排序方法有冒泡排序和快速排序。
冒泡排序
基本思想:
每趟不断将记录两两比较,若发现逆序,则
冒泡排序算法评价
(1)时间复杂性分析: 待排序列为正序: – 比较次数n-1,交换次数0; 待排序列为逆序: – 比较次数n(n-1)/2,交换次数n(n-1)/2; 2 故总的时间复杂度为O(n ), 由于其中的元素移动较多,所以属于内排序中速度 较慢的一种。 (2)空间复杂度分析 s(n)=O(1) (3)算法的稳定性: 因为冒泡排序算法只进行元素间的顺序移动,所 以是一个稳定的算法。
相关文档
最新文档