交换排序

合集下载

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、交换排序1)气泡排序(bubble sorting)也是一种简单排序方法,T(n)=O(n2)算法:A[n],第一次排序区间为A[0]~A[n-1],第二次排序区间为A[1]~A[n-1,]…,最后一次排序区间为A[n-2]~A[n-1],每次排序轻者上浮,即排序区间最小者交换到排序区间的第一个位置,经n-1次排序。

完成排序过程。

Example 1#include<iostream>using namespace std;struct ET{int x;};void select(ET A[],int n){ET e;for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){if(A[i].x>A[j].x){e=A[i];A[i]=A[j];A[j]=e;}}}}void display(ET a[],int n){for(int i=0;i<n;i++){cout<<a[i].x<<" ";}cout<<"\n";}void main(){ET a[10];/* a[0].x=100;a[1].x=20;a[2].x=15;a[3].x=50;a[4].x=200;a[5].x=80;a[6].x=300;a[7].x=10; */for(int i=0;i<10;i++){a[i].x=rand()/100;}cout<<"\n===========排序前====================\n\n";display(a,10);cout<<"\n===========排序后====================\n\n";select(a,10);display(a,10);cout<<endl;}Examplae 2#include<iostream>using namespace std; struct ET{int no;char* name;char* sex;double score;};void insertSort(ET A[],int n) {ET x;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(A[i].no>A[j].no){x=A[i];A[i]=A[j];A[j]=x;}}}}void insertSort1(ET A[],int n) {ET x;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(A[i].score>A[j].score){x=A[i];A[i]=A[j];A[j]=x;}}}}void display(ET e[8]){ for(int i=0;i<8;i++){cout.width(6);cout<<e[i].no<<" ";cout.width(12);cout<<e[i].name<<" ";cout.width(6);cout<<e[i].sex<<" ";cout.width(6);cout<<e[i].score<<endl;}}void main(){ET a[8];a[0].no=36;a[0].name="Bill Gates";a[0].sex="男";a[0].score=100;a[1].no=25;a[1].name="FF Gates";a[1].sex="女";a[1].score=98;a[2].no=48;a[2].name="Lucy Gates";a[2].sex="男";a[2].score=77;a[3].no=12;a[3].name="Jack Gates";a[3].sex="男";a[3].score=88;a[4].no=65;a[4].name="GG Gates";a[4].sex="女";a[4].score=66;a[5].no=43;a[5].name="BB Gates";a[5].sex="男"; a[5].score=99;a[6].no=20;a[6].name="KK Gates";a[6].sex="男";a[6].score=78;a[7].no=58;a[7].name="PP Gates";a[7].sex="男";a[7].score=99;cout<<"\n========排序前========================\n\n"; display(a);insertSort(a,8);cout<<"\n========排序后(按学号排序)==============\n\n"; display(a);insertSort1(a,8);cout<<"\n========排序后(按学分排序)==============\n\n"; display(a);}2)快速排序(quick sorting)(不稳定算法)是目前所有排序方法中速度最快的排序方法(但逼简单排序方法多占用n个栈空间)。

概述插入排序交换排序选择排序归并排序分配排序外排序

概述插入排序交换排序选择排序归并排序分配排序外排序
内排序与外排序 区分标准:排序过程是否全部 在内存进行。
排序的时间开销 它是衡量算法好坏的最重要的 标志。通常用算法执行中的数据比较次数和数据 移动次数来衡量。
排序的方法有很多,但简单地判断那一种算 法最好,以便能够普遍选用则是困难的。 评价排序算法好坏的标准主要有两条:算法 执行所需要的时间和所需要的附加空间。 另外,算法本身的复杂程度也是需要考虑 的一个因素。 排序算法所需要的附加空间一般都不大,矛 盾并不突出。而排序是一种经常执行的一 种运算,往往属于系统的核心部分,因此 排序的时间开销是算法好坏的最重要的标 志。
若初始时关键字递减有序,这是最坏情况。这 时的记录比较和移动次数分别为:
n
比较次数 的 i(n最 2)n (大 1)/2 值 O (n2) i2
n
移动次数 的 (i1 最 2)(大 n1)值 n (4)/2O (n2) i2
直接插入排序的稳定性
直接插入排序是一种稳定的排序方 法。
假设待排序的个对象的序列为[][],..., [],起始时排 序范围是从[]到[]
在当前的排序范围之内,自右至左对相邻的两个结 点依次进行比较,让值较大的结点往下移(下沉), 让值较小的结点往上移(上冒)。每趟起泡都能保证 值最小的结点上移至最左边,下一遍的排序范围为 从下一结点到[]。
算法分析
直接插入排序算法由两重循环组成,对于有个 记录的排序,内循环表明完成一趟排序所需进 行的记录关键字间的比较和记录的后移。
若初始时关键字递增有序,这是最好情况。每 一趟排序中仅需进行一次关键字的比较,所以 总的比较次数为。在循环之前和之中,至少要 移动记录两次,所以总的比较次数为()。
属性域。 主关键字 不同的数据对象若关键字互不

排序的基本概念

排序的基本概念
作业布置
习题9
教学后记
教 案(实验课)
第 34次课 2 学时
章节
第九章排序
重点
难点
重点:
各种排序算法的基本思想
难点:
各种排序算法的基本思想
要求掌握知识点和分析方法
掌握各种排序的基本原理
掌握本章要求的排序算法
教学内容
上机完成案例。
要求:
完成本章排序综合案例。
作业布置
完成本次课程实验报告
教学后记
讲授主要内容
选择排序;归并排序;基数排序;各种排序方法的比较和选择
重点
难点
重点:
1.选择排序
2.归并排序
3.基数排序
4.各种排序方法的比较和选择
难点:
1.选择排序
2.归并排序
3.基数排序
4.各种排序方法的比较和选择
要求掌握知识点和分析方法
熟练掌握直接选择排序
掌握堆排序
理解归并排序
理解基数排序
掌握各种排序方法的比较和选择
教学设计
1.利用算法动态演示,讲解直接选择排序,给出算法及其性能分析
2.利用算法动态演示,讲解堆排序,给出算法及其性能分析。重点分析堆排序的步骤
3.利用算法动态演示,讲解归并排序,给出算法及其性能分析
4.利用算法动态演示,讲解基数排序,给出算法及其性能分析
5.分析各种排序方法的比较和选择,并通过课堂练习加以深刻理解
熟练掌握直接插入排序
熟练掌握二分插入排序
理解希尔排序
熟练掌握冒泡排序、快排
教学设计
1.给出排序的相关基本概念:排序、稳定性、内排序与外排序、就地排序。
2.利用算法动态演示,讲解直接插入排序,给出算法及其性能分析

排序 2

排序 2

冒泡排序是交换排序的一种。

所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。

交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

它和气泡从水中往上冒的情况有些类似。

其具体做法是:对1至n个记录,先将第n个和第n-1个记录的键值进行比较,如r[n].key<r[n-1].key,则将两个记录交换。

然后比较第n-1个和第n-2个记录的关键字;依次类推,直到第2个记录和第1个记录进行比较交换,这称为一趟冒泡。

这一趟最明显的效果是:将键值最小的记录传到了第1位。

然后,对2至n个记录进行同样操作,则具有次小键值的记录被安置在第2位上。

重复以上过程,每次的移动都向最终排序的目标前进,直至没有记录需要交换为止。

具体实现时,可以用一支旗子flag表示第i趟是否出现交换。

如果第i趟没有交换,则表示此时已完成排序,因而可以终止。

69, 67, 75, 100, 89, 90, 99, 87第1次排序结果:69 75 100 89 90 99 87 67第2次排序结果:75 100 89 90 99 87 69 67第3次排序结果:100 89 90 99 87 75 69 67第4次排序结果:100 90 99 89 87 75 69 67第5次排序结果:100 99 90 89 87 75 69 67第6次排序结果:100 99 90 89 87 75 69 67第7次排序结果:100 99 90 89 87 75 69 67最终排序结果:100 99 90 89 87 75 69 67插入排序类似玩牌时整理手中纸牌的过程。

插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。

[49] 38 65 97 76 13 27 49i=2(38) [38 49] 65 97 76 13 27 49i=3(65) [38 49 65] 97 76 13 27 49i=4(97) [38 49 65 97] 76 13 27 49i=5(76) [38 49 65 76 97] 13 27 49i=6(13) [13 38 49 65 76 97] 27 49i=7(27) [13 27 38 49 65 76 97] 49i=8(49) [13 27 38 49 49 65 76 97]选择排序的基本思想是:第i趟在n-i+1(i=1,2,...,n-1)个记录中选取键值最小的记录作为有序序列的第i个记录。

几种排序算法比较

几种排序算法比较

⼏种排序算法⽐较排序对⽐图⼀、交换排序:1、冒泡算法:核⼼:相邻⽐⼤⼩,交换遍历length-1遍每遍的⼦遍历遍历length-i遍(第1遍时,i=2)Bubble_Sort(int &array[]){for(i = 1; i<length-1,i++){for(j = 0; j<length-i; j++){ //第1遍时,i为2if array[j] >array[j+1]{int help = array[j];array[j] = array[j+1];array[j+1] = help;}}}}..2、快速排序:核⼼:将序列排好,分解为⼦序列,⼦序列继续排列,排列完的⼦序列继续分⾃⾝的⼦序列特点:在同⼀个数组上排序,⽆需格外数组,不断排序(1)⾸先设定⼀个分界值,通过该分界值将数组分成左右两部分。

(2)将⼤于或等于分界值的数据集中到数组右边,⼩于分界值的数据集中到数组的左边。

此时,左边部分中各元素都⼩于或等于分界值,⽽右边部分中各元素都⼤于或等于分界值。

(3)然后,左边和右边的数据可以独⽴排序。

对于左侧的数组数据,⼜可以取⼀个分界值,将该部分数据分成左右两部分,同样在左边放置较⼩值,右边放置较⼤值。

右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这是⼀个递归定义。

通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。

当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

void split(int &array,[] int start, int end){int key = quicksort(start, end);split(stat, key-1);split(key+1, end );}void quicksort(int &array[], int start, int end){key = array[start];while(start != end && start != end+1){while (array[end] >= key && start<end)end--;if(start < end)array[start++] = array[end]; //引⽤后再加1;while(array[start] > key && start <end)start++;if(start < end)array[end-- ] = array[start]; //引⽤后再减1;}array[start] = key; //退出时start == end, 讲基准数放⼊坑中return key;}..更加简洁的代码:void quick_sort(int s[], int l, int r){if (l < r){//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第⼀个数交换参见注1int i = l, j = r, x = s[l];while (i < j){while(i < j && s[j] >= x) // 从右向左找第⼀个⼩于x的数j--;if(i < j)s[i++] = s[j];while(i < j && s[i] < x) // 从左向右找第⼀个⼤于等于x的数i++;if(i < j)s[j--] = s[i];}s[i] = x;quick_sort(s, l, i - 1); // 递归调⽤quick_sort(s, i + 1, r);}}// 此代码,作者:MoreWindows原⽂:https:///morewindows/article/details/6684558..⼆、插⼊排序思想:遍历 length-1遍“⼦遍历”每遍“⼦遍历”遍历 i 遍insertion_sort(int &array[]){int i,j,help = 0;for(i = 0; i<length-1; i++){j = i; //第1遍时,j=1;while(j > 0){if(array[j] < array[j-1]){help = array[j];array[j] = array[j-1];array[j-1] = array[j];}}}}..三、选择排序:思想:从⼩到⼤排序,从左往右遍历,每次遍历,flag = “⼦遍历的⾸位数下标”,“⼦遍历”每次找到⽐flag⼩的数,就记录其下标flag = 下标;⼦遍历结束,⼦遍历的⾸位数与数组flag标记位置交换Selection_sort(int &array[]){for(int i = 0; i<array.length-2; i++ ){int flag = i-1;for(int j = i; j<length-2; j++){ //第1遍时,j = 1;if(array[flag] > array[j]) flag = j;}int help = array[i-1];array[i-1] = array[flag];array[flag] = help;}}..四、归并排序思想:归并算法与快速排序相反,是把顺序的⼦序列给合并起来,再排序需要借助格外数组稳定//排序获取的两个⼦数组void Sort(int &array[],int start,int middle,int end){if()int help[] = new int[];int i =start,j = middle+1,z = 0;while(i != middle+1 && j != end+1;){ //⽐较数据并且交换if(array[i] <= array[j]){help[z] = array[i];i++;}else{help[z] = array[j];j++;}z++;}if(i != middle+1){ //help数组追加数组后⾯较⼤的数据while(i != middle+1){help[z] = array[i];i++;}}else if(j != end+1){while(i != middle+1){help[z] = array[j];j++;}}z = 0; //help数组导⼊array数组while(start != end+1){array[start] = help[z];start++;}}//开始归并排序函数;递归合并⼦数组//若数组数为偶数,中间数偏左void Merge(int &array[],int start,int end){int middle = (end + start)/2;Merge(&array,start, middle); //数组数为偶数,左数组数⽐右数数组多1 Merge(&array,middle+1, end);Sort(&array,start, middle,end)}。

概述插入排序交换排序选择排序归并排序基数排序外部排序小结

概述插入排序交换排序选择排序归并排序基数排序外部排序小结

Type getKey ( ) { return key; } //提取关键字 void setKey ( const Type x ) { key = x; } //修改 Element<Type> & operator = //赋值 ( Element<Type> & x ) { this = x; } int operator == ( Type & x ) //判this == x { return ! ( this->key >x || x < this->key ); } int operator != ( Type & x ) //判this != x { return this->key < x || x < this->key ; } int operator <= ( Type & x ) //判this x { return ! (this->key > x ); } int operator >= ( Type & x ) //判this x { return ! (this->key < x ); } int operator < ( Type & x ) //判this < x { return this->key > x; }
KCN i n(n 1) / 2 n / 2,
2 i 1 n 1
RMN (i 2) (n 4)(n 1) / 2 n / 2
2 i 1
n 1


若待排序对象序列中出现各种可能排列的概 率相同,则可取上述最好情况和最坏情况的 平均情况。在平均情况下的关键字比较次数 和对象移动次数约为 n2/4。因此,直接插入 排序的时间复杂度为 o(n2)。 直接插入排序是一种稳定的排序方法。

c语言 交换数组顺序

c语言 交换数组顺序

c语言交换数组顺序在C语言中,交换数组的顺序有多种方法。

最常见的方法是使用一个临时变量来交换数组元素的值。

假设我们有一个整型数组arr,我们想要交换它的顺序,可以这样做:c.void swap(int a, int b) {。

int temp = a;a = b;b = temp;}。

void reverseArray(int arr[], int start, int end) {。

while (start < end) {。

swap(&arr[start], &arr[end]);start++;end--;}。

}。

在这个例子中,我们定义了一个swap函数来交换两个整数指针所指向的值,然后定义了一个reverseArray函数来实现数组的逆序。

我们可以通过调用reverseArray(arr, 0, n-1)来逆序整个数组arr,其中n是数组的长度。

另一种方法是使用指针来交换数组元素的值,这样可以节省一些空间。

下面是一个使用指针的例子:c.void reverseArray(int arr[], int n) {。

int start = arr;int end = arr + n 1;while (start < end) {。

int temp = start;start = end;end = temp;start++;end--;}。

}。

在这个例子中,我们使用指针start和end来指向数组的首尾元素,然后交换它们的值,直到start不再小于end为止。

除了上述方法,还可以使用递归的方式来逆序数组,或者利用标准库函数如memcpy来实现数组元素的交换。

总之,C语言提供了多种灵活的方式来交换数组的顺序,可以根据具体情况选择合适的方法来实现。

index排序

index排序

void BubbleSort(Elem R[ ], int n)
{ i = n; // i 指示无序序列中最后一个记录的位置 while (i >1)
{ lastExchangeIndex = 1; for (j = 1; j < i; j++) if (A[j+1] < A[j]) { Swap(A[j],A[j+1]); lastExchangeIndex = j; } i = lastExchangeIndex;
10.3 交换排序
交换排序的基本思想是:两两比较待排序记录的关键 码,如果发生逆序(即排列顺序与排序后的次序正好 相反),则交换之,直到所有记录都排好序为止。
交换排序的主要算法有:
1) 冒泡排序 2) 快速排序
1) 冒泡排序
基本思路:每趟不断将记录两两比较,并按“前小后大” (或“前大后小”)规则交换。 优点:每趟结束时,不仅能挤出一个最大值到最后面位置, 还能同时部分理顺其他元素;一旦下趟没有交换发 生,还可以提前结束排序。 前提:顺序存储结构
1
2
21
08
25
16
3 49
21
4
25*
25*
16
49
08
25
( 08 ,16 ) Low=high=3,本趟停止,将 支点定位并返回位置信息
21
( 25* ,
*
49, 25 )
25 跑到了前面,不稳定!
编程说明: ①每一趟子表的形成是采用从两头向中间交替式逼近法; ②由于每趟中对各子表的操作都相似,主程序可采用递归算法。
例:关键字序列 T=(21,25,49,25*,16,08),请写出 冒泡排序的具体实现过程。

交替排序法名词解释

交替排序法名词解释

交替排序法名词解释1.引言1.1 概述交替排序法是一种常见的排序算法,也被称为奇偶排序法或定向冒泡排序法。

它是一种简单直观的排序方法,通过比较和交换相邻元素的位置来达到排序的目的。

这种排序算法最早是为并行计算机设计的,利用了并行计算的特性以提高排序的效率。

在并行计算中,数据被划分为多个子序列,并行处理这些子序列,最后再合并得到有序的结果。

交替排序法的基本思想是:将待排序的序列分为奇数位置和偶数位置两个子序列,然后分别对这两个子序列进行排序。

首先比较并交换奇数位置相邻的元素,然后比较并交换偶数位置相邻的元素,重复以上步骤,直到序列完全有序。

可以看出,每一轮排序都会有一个元素被放置在正确的位置上,因此需要多次迭代来完成排序过程。

交替排序法的优势在于其简单易懂的算法逻辑和相对较好的性能。

它的时间复杂度为O(n^2),与冒泡排序类似,但交替排序法的并行化处理可以提高它的实际效率。

此外,交替排序法的算法思想也可以应用于其他排序算法的优化,例如快速排序和归并排序等。

总的来说,交替排序法是一种简单而实用的排序算法,它在并行计算和算法优化中有着重要的应用价值。

在接下来的章节中,我们将详细介绍交替排序法的定义和应用场景,以及总结其优点和展望其发展前景。

1.2 文章结构本文将围绕交替排序法展开论述,并且按照以下结构进行组织:引言部分将首先给出对交替排序法的概述,简要介绍该排序方法的基本原理和特点。

接着将介绍本文的整体结构,以引导读者对文章内容有一个清晰的了解。

最后,在引言部分说明文章的目的,即通过对交替排序法的深入探讨,分析其应用场景、优点以及未来的发展前景。

正文部分将分为两个主要部分,分别是交替排序法的定义和交替排序法的应用场景。

在第一个主要部分中,会详细阐释交替排序法的定义。

首先会从算法的基本原理出发,介绍排序的过程和步骤。

然后会对交替排序法的时间复杂度和空间复杂度进行分析,以评估其在实际应用中的效率。

此外,还将深入讨论交替排序法在处理不同规模和类型的数据时的优势和局限性。

5_2 交换与选择排序

5_2 交换与选择排序
7
5.3.1
冒泡排序

下降法示例 a 0 8 1 3 2 4 3 9 4 7
自上而下地扫描的下降法
最大元素下降到底部
0 1 2 3
4
a 8 3 4 9 7
0 1 2 3
4
a 3 8 4 9 7
0 1 2 3
4
a 3 4 8 9 7
0 1 2 3
4
a 3 4 8 9 7
0 1 2 3
4
a 3 4 8 7 9
不交换, 再比较 8 和 3
3 8 4 7 9
交换 8 和 3
3 8 4 7 9
上升结果
比较 9 和 7
6
5.3.1
冒泡排序
2. 简单的冒泡排序算法(上升法)
void bubble_sort(int a[ ],int n) { int i,j,x; 1. for(j=0;j<n-1; j++) // j是本遍扫描终点下标 2. for(i=n-2;i>=j; i-- ) 3. if(a[i]>a[i+1]) //逆序 4. { x=a[i]; a[i]=a[i+1]; a[i+1]=x; } }
5.3.2 快速排序(quick sort )
1.基本原理 也称划分交换排序,因速度非常快而得名
反复进行有序划分 在数组a中任选一个元素x作为划分元素,通过比较 将小于x的元素换到数组的左端(左段) 将大于或等于x的元素换到数组右端(右段) x本身位于两段之间 如果左、右段元素个数多于1,则递归的将左、右段各自划分, 直到每段元素个数都不超过1,从而达到排序目的
27
5.4.3 堆排序( heap sort )

c23-交换排序

c23-交换排序

54
整个归并排序仅需 log 趟 2n 93 21 25 25* 49 08 62 72
08 21 25 25* 49 62 72 93
16 37 54 16 37 54
len=16 08 16 21 25 25* 37 49 54 62 72 93
22
归并排序
算法分析
时间效率 O(nlog2n) 空间效率O(n)

关键字序列T= (21,25,49,25*,93,62,72,08, 37,16,54),请给出归并排序的具体实现过程。
21
归并排序
len=1 21 25 49 25* 93 62 72 08 37 16 54 len=2 len=4 len=8
21 25
25* 49
62 93
08 72
16 37
交换排序
数据结构(第二十三讲)
知识回顾
插入排序的基本思想 希尔排序的基本思想
2
教学内容
交换排序介绍 起泡排序 快速排序 归并排序 基数排序
3
本讲重点、难点
重点
交换排序的基本思想 起泡排序算法 快速排序算法 掌握归并排序的基本思想 掌握基数排序的基本思想
每一趟子表的形成是采用从两头向中间交替式逼近法; int Partition(SqList &L,int low,int high){ //一趟快速排序 //交换子表 r[low…high]的记录,使支点(枢轴)记录到位,并返回其位 置。返回时,在支点之前的记录均不大于它,支点之后的记录均不小于 它。 L.r[0]=L.r[low]; //以子表的首记录作为支点记录,放入r[0]单元 while(low < high){ //从表的两端交替地向中间扫描 while(low<high &&L.r[high].key>=pivotkey ) - -high; L.r[low]=L.r[high]; //比支点小的记录交换到低端; while(low<high && L.r[low].key<=pivotkey) + +low; L.r[high]=L.r[low]; //比支点大的记录交换到高端; } L.r[low]=L.r[0]; //支点记录到位; return low; //返回支点记录所在位置。 }//Partition

交替排序法的实施步骤

交替排序法的实施步骤

交替排序法的实施步骤介绍交替排序法,也称为奇偶排序法,是一种简单而有效的排序算法。

它通过不断交替地比较和交换邻近的元素,从而将待排序的数列逐渐变得有序。

该算法适用于各种数据量规模,并且易于实现。

本文将介绍交替排序法的实施步骤,以帮助读者了解和运用该算法。

步骤1.将待排序的数列分成两个子序列A和B。

初始情况下,A为数列的所有奇数位置上的元素,B为数列的所有偶数位置上的元素。

2.重复以下步骤,直到数列完全有序:–在子序列A中,从第一个元素开始,依次比较相邻的两个元素。

如果前一个元素比后一个元素大,则交换它们的位置。

–在子序列B中,从第一个元素开始,依次比较相邻的两个元素。

如果前一个元素比后一个元素大,则交换它们的位置。

–重复以上两步,直到子序列A和子序列B中没有相邻的元素需要交换(即两个子序列都已有序)。

3.合并子序列A和子序列B,得到一个有序的数列。

示例为了更好地理解交替排序法的实施步骤,我们来看一个具体的示例。

假设我们有以下数列需要进行排序:[7, 3, 9, 2, 5, 1, 8, 6, 4]。

初始状态数列分成两个子序列A和B: - A:[7, 9, 5, 8, 4] - B:[3, 2, 1, 6]第一次迭代在子序列A中,我们依次比较相邻的两个元素,交换位置: - A:[7, 5, 9, 4, 8] - B:[3, 1, 2, 6]在子序列B中,我们依次比较相邻的两个元素,交换位置: - A:[7, 5, 9, 4, 8] - B:[1, 3, 2, 6]第二次迭代在子序列A中,我们依次比较相邻的两个元素,交换位置: - A:[5, 7, 4, 9, 8] - B:[1, 2, 3, 6]在子序列B中,我们依次比较相邻的两个元素,交换位置: - A:[5, 7, 4, 9, 8] - B:[1, 2, 3, 6]第三次迭代在子序列A中,我们依次比较相邻的两个元素,交换位置: - A:[5, 4, 7, 8, 9] - B:[1, 2, 3, 6]在子序列B中,我们依次比较相邻的两个元素,交换位置: - A:[5, 4, 7, 8, 9] - B:[1, 2, 3, 6]第四次迭代在子序列A中,我们依次比较相邻的两个元素,交换位置: - A:[4, 5, 7, 8, 9] - B:[1, 2, 3, 6]在子序列B中,我们依次比较相邻的两个元素,交换位置: - A:[4, 5, 7, 8, 9] - B:[1, 2, 3, 6]第五次迭代在子序列A中,我们依次比较相邻的两个元素,交换位置: - A:[4, 5, 7, 8, 9] - B:[1, 2, 3, 6]在子序列B中,我们依次比较相邻的两个元素,交换位置: - A:[4, 5, 7, 8, 9] - B:[1, 2, 3, 6]最终结果合并子序列A和子序列B,得到一个有序的数列: [1, 2, 3, 4, 5, 6, 7, 8, 9]总结交替排序法是一种简单而有效的排序算法,通过不断交替地比较和交换邻近的元素,将待排序的数列逐渐变得有序。

数据结构第23讲-插入排序2和交换排序-C

数据结构第23讲-插入排序2和交换排序-C

状态
1
0 - - - - - - - next域
0
1 2345678
i=2 MAXINT 49 388 65 97 76 13 27 49
21
0 1- - - - - - -
0
1 2345678
i=3 MAXINT 49 38 65 97 76 13 27 49
2
03 1 0- - - - - -
0
2)待排记录序列的存储结构
#define MAXSIZE 100
//静态链表容量
Typedef struct{
RcdType rc;
//记录项
int next;
//指针项
} SLNode; //表结点类型
Typedef struct{
SLNode r[MAXSIZE+1]; //0号单元为表头结点
21 ( 21 枢轴 low
21 ( 21 枢轴 llooww
21 ( 09 枢轴
21 ( 09 枢轴
21 ( 09
03 37
03 37
03 37 low
03 13 llooww
03 13
13 91
13 91
13 91
13 91 high
21 91
09 ) high
09 ) high )
hihgihgh 37 )
本操作仍是将一个记录插入到已排好序的有序表 当中。和直接插排序相比,不同之处仅是以修改 2n次指针值代替移动记录,排序过程中所需进行 的关键字间的比较次数相同。因此表插入排序的 时间复杂度仍是O(n2)。
4)表插入排序性能分析 表插入排序的结果只是求得一个有序链表,
则只能对它进行顺序查找,不能进行随机查找, 为了能实现有序表的折半查找,尚需对记录进行 重新排列。

交换排序实现思路

交换排序实现思路

交换排序实现思路
交换排序是一种通过不断交换相邻元素的位置来实现排序的算法。

以下是一种常见的交换排序实现思路:
1. 确定一个基准值:可以使用选边法、随机法或三数取中法来确定。

2. 做分割:遍历整个数组区间,比较每个数和基准值的大小关系,遍历结束后让比基准值小的放到它左边,比基准值大的放到它右边。

通过重复执行上述步骤,直到整个数组有序为止。

不同的交换排序算法可能会采用不同的策略来确定基准值和进行分割,以提高算法的效率和性能。

数字交换原理

数字交换原理

数字交换原理
数字交换原理是一种常用的排序算法,在进行数据处理和计算时很有用。

它的基本原理是在待排序的数字序列中,比较相邻两个数字的大小,并根据需要进行交换,从而达到将数字序列按照一定的规则进行排序的目的。

具体来说,数字交换原理可以通过以下步骤来实现:
1. 设定一个待排序的数字序列,可以是一个数组或者列表。

2. 从序列的第一个数字开始,依次与其后的数字进行比较。

3. 如果当前的数字大于后面的数字(升序排序),则进行交换。

4. 继续比较并交换,直到序列中所有相邻的数字都被比较过。

5. 重复以上步骤,直到整个序列都被遍历完毕,并且没有需要交换的数字为止。

通过这种方式,数字交换原理可以将待排序的数字序列逐步调整为有序的序列。

这种算法的时间复杂度为O(n^2),其中n
表示待排序序列的长度。

在实际应用中,数字交换原理常常被用于对简单的数字序列进行排序。

但是在处理大规模数据时,由于其时间复杂度较高,往往会选择其他更高效的排序算法来替代。

总的来说,数字交换原理是一种简单但是有效的排序算法。

它通过比较和交换数字的方式,将待排序的数字序列转化为有序的序列。

通过理解和运用数字交换原理,可以更好地处理和排序数字数据。

交换排序.ppt

交换排序.ppt
减少总的比较次数和移动次数
增大记录的比较和移动距离
较大记录从前面直接移动到后面 较小记录从后面直接移动到前面
•17
3、快速排序 首先对无序的记录序列进行“一次划分”,之后分别对分割
所得两个子序列“递归”进行一趟快速排序。 快速排序过程
无序的记录序列 一次划分
无序记录子序列 (1) 枢轴 无序子序列 (2)
•24
8.2.2 快速排序 示例8.2.4 以图8.2.2和图8.2.3所示例子为例,设
计 测 试 示 例 8.2.3 中 创 建 的 quickSort() 函 数 的 测试程序。
•25
小结 • 冒泡排序算法 • 快速排序算法
•26
例:
52
s
t
Байду номын сангаас
2523 49 1840 36 5124 58 61 97 2830 75
low low low low highhigh high high high high low
设 R[s]=52 为枢轴。
•19
8.2.2 快速排序
•20
8.2.2 快速排序
•21
到目前为止快速排序是平均速度最大的一种排序方法。 时间复杂度为 O(n log n)。
•8
8.2.1 冒泡排序
2. 第2趟时,循环次数减1,即数据元素个数为n-1, 操作方法和第1趟的类似,这样整个n个数据元素 集合中数值次大的数据元素将被放置在a[n-2]中。
3. 当第n-1趟结束时,整个n个数据元素集合中次小 的数据元素将被放置在a[1]中,a[0]中放置了最小 的数据元素。
•9
• 基本思想:设数组a中存放了n个数据元素,循环 进行n-1趟如下的排序过程:

常用的内部排序方法

常用的内部排序方法

常用的内部排序方法有:交换排序(冒泡排序、快速排序)、选择排序(简单选择排序、堆排序)、插入排序(直接插入排序、希尔排序)、归并排序、基数排序(一关键字、多关键字)。

一、冒泡排序:1.基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。

2.排序过程:设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

【示例】:49 13 13 13 13 13 13 1338 49 27 27 27 27 27 2765 38 49 38 38 38 38 3897 65 38 49 49 49 49 4976 97 65 49 49 49 49 4913 76 97 65 65 65 65 6527 27 76 97 76 76 76 7649 49 49 76 97 97 97 97二、快速排序(Quick Sort)1.基本思想:在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X 则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。

2.排序过程:【示例】:初始关键字[49 38 65 97 76 13 27 49]第一次交换后[27 38 65 97 76 13 49 49]第二次交换后[27 38 49 97 76 13 65 49]J向左扫描,位置不变,第三次交换后[27 38 13 97 76 49 65 49]I向右扫描,位置不变,第四次交换后[27 38 13 49 76 97 65 49]J向左扫描[27 38 13 49 76 97 65 49](一次划分过程)初始关键字[49 38 65 97 76 13 27 49]一趟排序之后[27 38 13]49 [76 97 65 49]二趟排序之后[13]27 [38]49 [49 65]76 [97]三趟排序之后13 27 38 49 49 [65]76 97最后的排序结果13 27 38 49 49 65 76 97三、简单选择排序1.基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

2-9交换排序

2-9交换排序

i=1 i=2
i=6 i=7
for (j = 1; j < i; j++) if (R[j+1].key < R[j].key) …
void BubbleSort(Elem R[ ], int n) { i = n; while (i >1) {
lastExchangeIndex = 1; for (j = 1; j < i; j++) if (R[j].key > R[j+1].key) { Swap(R[j], R[j+1]);
3489 49 49 4193 132387 27 27 27
65 65 6153 142397 233780 30 30
9776 7163 162357 243790 3308 38
719637 271763 263750 3409 49
19237
27 7360
6350
65
239707 7360 76
lastExchangeIndex = j; /*记下进行交换的记录位置*/ }
i = lastExchangeIndex; /*本趟最后一次交换的位置*/ } }
算法评价
时间复杂度
最好情况(正序)
比较次数:n-1
移动次数:0
最坏情况(逆序)
比较次数:n1 (n i) 1 (n2 n)
i 1
2

移动次数:3n (n i 1

i)

3 2
(n 2

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

成绩评定表课程设计任务书目录一、题目概述(内容及要求) (4)二、功能分析 (4)三、设计 (6)四、运行与测试 (9)五、总结 (10)参考文献 (11)一、题目概述(内容及要求)实验内容:输入数据对数据按菜单选择对数据进行交换排序。

实验要求:1.菜单列出所有交换排序。

2.对数据按菜单选择的进行排序。

3.统计比较和交换的次数。

二、功能分析1.交换排序:分为冒泡排序和快速排序2.交换排序算法分析(1)冒泡排序基本思想:设排序表中有n个数据元素。

首先对排序表中第一,二个数据元素的关键字arr[0]和arr[1]进行比较。

如果前者大于后者,则进行交换;然后对第二,三个数据做同样的处理;重复此过程直到处理完最后两个相邻的数据元素。

我们称之为一趟冒泡,它将关键字最大的元素移到排序表的最后一个位置,其他数据元素一般也都向排序的最终位置移动。

然后进行第二趟排序,对排序表中前n-1个元素进行与上述同样的操作,其结果使整个排序表中关键字次大的数据元素被移到arr[n-2]的位置。

如此最多做n-1趟冒泡就能把所有数据元素排好序。

(2)快速排序基本思想:快速排序(Quick Sort)又被称做分区交换排序,这是一种平均性能非常好的排序方法。

其算法基本思想是:任取排序表中的某个数据元素(例如取第一个数据元素)作为基准,按照该数据元素的关键字大小,将整个排序表划分为左右两个子表:左侧子表中所有数据元素的关键字都小于基准数据元素的关键字。

右侧子表中所有数据元素的关键字都大于或等于基准数据元素的关键字,基准数据元素则排在这两个子表中间(这也是该数据元素最终应安放的位置),然后分别对这两个子表重复施行上述方法的快速排序,直到所有的子表长度为1,则排序结束。

3.算法性能分析(1)冒泡排序(稳定的排序算法) 1.时间复杂度:a.最好情况(正序)b.比较次数:n-1(只要进行一趟即可)c.移动次数:0d.最坏情况(逆序)e.比较次数:(需n-1趟,每趟达到最大比较次数)f.移动次数:在最坏情况下,时间复杂度为:T(n)=O(n²) 2.空间复杂度:S(n)=O(1)(2)快速排序快速排序(不稳定的排序方法) 1.时间复杂度最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n²) 2.空间复杂度:需栈空间以实现递归 最坏情况:S(n)=O(n) 一般情况:S(n)=O(l og2n)图2.1 菜单选择流程图)(21)(211n n i n n i -=-∑-=)(23)(321n n i n ni -=-∑=图2.2 程序整体流程图三、设计1.类型定义:typedef struct {ElemType *base; //数组元素基址,由InitArray分配int dim; //数组维数int *bounds; //新数组元素维界基址,由InitArray分配int *constants; //数组映象函数常量基址,由InitArray分配}2.算法分析:(1)快速排序算法分析任取排序表中的某个数据元素(例如取第一个数据元素)作为基准,按照该数据元素的关键字大小,将整个排序表划分为左右两个子表:左侧子表中所有数据元素的关键字都小于基准数据元素的关键字。

右侧子表中所有数据元素的关键字都大于或等于基准数据元素的关键字,基准数据元素则排在这两个子表中间(这也是该数据元素最终应安放的位置),然后分别对这两个子表重复施行上述方法的快速排序,直到所有的子表长度为1,则排序结束。

(2)冒泡排序算法分析设排序表中有n个数据元素。

首先对排序表中第一,二个数据元素的关键字arr[0]和arr[1]进行比较。

如果前者大于后者,则进行交换;然后对第二,三个数据做同样的处理;重复此过程直到处理完最后两个相邻的数据元素。

我们称之为一趟冒泡,它将关键字最大的元素移到排序表的最后一个位置,其他数据元素一般也都向排序的最终位置移动。

然后进行第二趟排序,对排序表中前n-1个元素进行与上述同样的操作,其结果使整个排序表中关键字次大的数据元素被移到arr[n-2]的位置。

如此最多做n-1趟冒泡就能把所有数据元素排好序。

3.算法描述:(1)冒泡排序的算法伪代码如下:template <class type>//冒泡排序void sortlist<type>:: bubblesort(){int i=1;int finish=0;//0表示还没有排好序while(i<currentsize &&!finish){finish=1;//排序结束标志置为,假定已经排好序for(int j=0;j<currentsize-i;j++)if(arr[j]>arr[j+1])//逆序{swap(arr[j],arr[j+1]);//相邻元素交换位置finish=0;}//排序结束标志置为,表示本趟发生了交换,说明还没有排好序i++;cout<<"第"<<++num<<"趟排序结果为:";for(int t=0;t<currentsize;t++)cout<<arr[t]<<" ";cout<<endl;}num=0;}(2)快速排序的具体算法template <class type>//快速排序void sortlist<type>::quicksort(int low,int high)//在待排序区间[low,high]上,递归地进行快速排序{int i=low,j=high;type temp=arr[low];//取区间第一个位置为基准位置if(i<j){while(i<j){while(i<j&&temp<arr[j])j--;if(i<j){swap(arr[i],arr[j]);i++;}while(i<j&&temp>=arr[i])i++;if(i<j){swap(arr[i],arr[j]);j--;}}arr[i]=temp;//将基准元素就位cout<<"第"<<++x<<"趟排序结果为:";for(int t=0;t<currentsize;t++)cout<<arr[t]<<" ";cout<<endl;quicksort(low,i-1);//在左子区间递归进行快速排序quicksort(i+1,high);//在右子区间递归进行快速排序}}4.程序的主要模块设计<1>主菜单主要功能:程序运行时,可使运行者根据提醒输入相关操作,从而进入不同的排序方法或者退出。

<2>排序方法及输出根据运行者对排序的不同选择,进入排序过程(a).冒泡排序:根据冒泡排序算法,输出排序过程(b).快速排序:根据快速排序的算法,输出排序过程四、运行与测试待测试的数据保存在data.txt记事本中,具体数据如下:图4.1测试数据预期显示结果为:0 1 2 3 4 5 5 6 6 8 11 11 12 16 16 18 21 22 23 23 23 24 26 26 27 27 29 29 29 29 31 33 34 35 36 37 37 38 38 39 40 40 41 41 41 42 42 42 44 44 45 46 47 47 48 48 50 53 53 54 56 57 58 59 61 62 62 64 64 64 66 67 67 68 69 69 70 71 73 76 78 81 82 82 84 84 88 90 90 91 91 92 93 94 95 95 99图4.2选择菜单图4.3排序结果及关键字比较次数五、总结本课程设计对我来说是比较难的,最终完成了算法。

这期间,遇到了各种麻烦,但是我并没有放弃,反复修改代码,经过不懈的努力,问题都相继解决。

从这次实践中,我意识到自己还有很多不足之处。

首先先说一下基本的。

对于各种排序算法的过程还是不够熟悉,进行编程时还需要翻书查找,对于这一点,只能说对数据结构的学习还不够扎实,虽然说这门课程以后就没有了,但是我想这门课对以后的学习会有很大帮助,所以有空时还应该继续熟悉这门课程。

其次,就是对于错误的处理,不能得心应手,不能正确处理一些简单的错误。

对于逻辑上的错误,不能够立即找到出错点,往往需要向同学请教才能找出错误,并且改正。

我觉得这是自己独自思考能力不高的问题,遇事需要自己仔细想想,若还不能改正,再请教别人也不迟。

这次试验我发现书本上的知识是一个基础,但是我基础都没掌握,更别说写出一个整整的程序了。

自己在写程序的时候,也发现自己的知识太少了,特别是基础知识很多都是模模糊糊的一个概念,没有落实到真正的程序,所以自己写的时候也感到万分痛苦,基本上涉及一个知识我就会看看书,对于书本上的知识没掌握好。

认真上好专业实验课,多在实践中锻炼自己。

写程序的过程中要考虑周到,严密。

在做设计的时候要有信心,有耐心,切勿浮躁。

巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。

通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。

培养了我选用参考书,查阅手册及文献资料的能力。

培养独立思考,深入研究,分析问题解决问题的能力。

通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念全局观念。

总而言之,从这次的实践中我学到了很多东西,希望以后能够多加运应。

参考文献1).《数据结构(C语言版)》严蔚敏吴伟民编著清华大学出版社2).《C语言程序设计第二版》谭浩强编著清华大学出版社附件:程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define LIST_INIT_SIZE 50000int bj1,yd1,n;clock_t start_t,end_t;typedef struct{ int key;}ElemType;typedef struct{ ElemType *elem;int length;}SqList;void addlist(SqList &L){ int i;a: printf("请输入你要输入的个数:");scanf("%d",&n);if(n>50000){ printf("超出范围重新输入!!!\n");goto a; }L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem)exit(0);L.length=0;for(i=1;i<n+1;i++){ b: L.elem[i].key=rand();if(L.elem[i].key>30000)goto b;++L.length; }}//选择void SelectSort(SqList &L){ start_t=clock();int i,j,k,bj=0,yd=0;for(i=1;i<L.length;i++){ k=i;for(j=i+1;j<L.length;j++){ bj++;if(L.elem[j].key<L.elem[k].key)k=j; }if(i!=k){ L.elem[0].key=L.elem[i].key;L.elem[i].key=L.elem[k].key;L.elem[k].key=L.elem[0].key;yd+=3;}}end_t=clock();printf("比较次数为%d移动次数为%d\n",bj,yd);printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); }//起泡void qipao(SqList &L){ start_t=clock();int i=1,j,bj=0,yd=0;while(i<L.length){ for(j=1;j<L.length;j++){ bj++;if(L.elem[j].key>L.elem[j+1].key){ L.elem[0].key=L.elem[j].key;L.elem[j].key=L.elem[j+1].key;L.elem[j+1].key=L.elem[0].key;yd+=3;}}i++;}end_t=clock();printf("比较次数为%d移动次数为%d\n",bj,yd);printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); }//直接插入void InsertSort(SqList &L){ start_t=clock();int i,j,yd=0,bj=0;for(i=2;i<=L.length;i++)if(L.elem[i].key<L.elem[i-1].key){L.elem[0].key=L.elem[i].key;yd++;j=i-1;bj++;while(L.elem[0].key<L.elem[j].key){L.elem[j+1].key=L.elem[j].key;j--;yd++;bj++;}L.elem[j+1].key=L.elem[0].key;yd++;}}end_t=clock();printf("比较次数为%d移动次数为%d\n",bj,yd);printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); }//希尔void xier(SqList &L){start_t=clock();int i,d=L.length/2,j,w=0,k,yd=0,bj=0;while(w<d)w=1;for(i=w;i<L.length;i=i+d){k=i;for(j=i+d;j<L.length;j=j+d){if(L.elem[i].key>L.elem[j].key){k=j;bj++;}}if(i!=k){L.elem[0].key=L.elem[i].key;L.elem[i].key=L.elem[k].key;L.elem[k].key=L.elem[0].key;yd+=3;}w++;}d=d/2;w=1;}end_t=clock();printf("比较次数为%d移动次数为%d\n",bj,yd);printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); }void BeforeSort(){yd1=0,bj1=0;}void display(int m,int n){printf("比较次数为%d移动次数为%d\n",m,n);}int Partition(SqList &L,int low,int high)//快速排序{int pivotkey;L.elem[0]=L.elem[low];yd1++;pivotkey=L.elem[low].key;while (low<high){yd1++;while(low<high&&L.elem[high].key>=pivotkey)--high;L.elem[low]=L.elem[high];bj1++;yd1++;while (low<high&&L.elem[low].key<=pivotkey)++low;L.elem[high]=L.elem[low];bj1++;yd1++;}L.elem[low]=L.elem[0];yd1++;return low;}void QSort(SqList &L,int low,int high){int pivotloc;if(low<high){pivotloc=Partition(L,low,high);QSort(L,low,pivotloc-1);QSort(L,pivotloc+1,high);}}void QuickSort(SqList &L){start_t=clock();BeforeSort();QSort(L,1,L.length);display(yd1,bj1);end_t=clock();printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); }void Merge(ElemType R[],ElemType R1[],int low,int m,int high)//归并{int i=low, j=m+1, k=low;while(i<=m&&j<=high){if(R[i].key<=R[j].key){bj1++;R1[k]=R[i];yd1++;i++;k++;}else{bj1++;R1[k]=R[j];yd1++;j++;k++;}}while(i<=m){R1[k]=R[i];yd1++;i++;k++;while(j<=high){R1[k]=R[j];yd1++;j++;k++;}}void MergePass(ElemType R[],ElemType R1[],int length, int n) { int i=0,j;while(i+2*length-1<n){ Merge(R,R1,i,i+length-1,i+2*length-1);i=i+2*length;}if(i+length-1<n-1)Merge(R,R1,i,i+length-1,n-1);elsefor(j=i;j<n;j++)R1[j]=R[j];}void MSort(ElemType R[],ElemType R1[],int n){ int length=1;while (length<n){MergePass(R,R1,length,n);length=2*length;MergePass(R1,R,length,n);length=2*length;}void MergeSort(SqList &L){ start_t=clock();BeforeSort();MSort(L.elem,L.elem,L.length);display(yd1,bj1);end_t=clock();printf("排序用时为%f\n",float(end_t-start_t)/CLK_TCK); }int main(){ SqList L;addlist(L);printf("起泡排序: \n");qipao(L);printf("直插排序: \n");InsertSort(L);printf("选择排序: \n");SelectSort(L);printf("希尔排序: \n");xier(L);printf("快速排续: \n");QuickSort(L);printf("归并排序: \n");MergeSort(L);}。

相关文档
最新文档