C语言9种常用排序法

合集下载

C语言常用算法归纳

C语言常用算法归纳

C语言常用算法归纳

应当掌握的一般算法

一、基本算法:

交换、累加、累乘

二、非数值计算常用经典算法:

穷举、排序(冒泡,选择)、查找(顺序即线性)

三、数值计算常用经典算法:

级数计算(直接、简接即递推)、一元非线性方程求根(牛顿迭代法、二分法)、定积分计算(矩形法、梯形法)

四、其他:

迭代、进制转换、矩阵转置、字符处理(统计、数字串、字母大小写转换、加密等)、整数各数位上数字的获取、辗转相除法求最大公约数(最小公倍数)、求最值、判断素数(各种变形)、数组元素的插入(删除)、二维数组的其他典型问题(方阵的特点、杨辉三角形)

详细讲解

一、基本算法

1.交换(两量交换借助第三者)

例1、任意读入两个整数,将二者的值交换后输出。

main()

{ int a,b,t;

scanf("%d%d",&a,&b);

printf("%d,%d\n",a,b);

t=a; a=b; b=t;

printf("%d,%d\n",a,b);

}

【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。

假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。

其中t为中间变量,起到“空杯子”的作用。

注意:三句赋值语句赋值号左右的各量之间的关系!

【应用】

例2、任意读入三个整数,然后按从小到大的顺序输出。

main()

{ int a,b,c,t;

scanf("%d%d%d",&a,&b,&c);

/*以下两个if语句使得a中存放的数最小*/

if(a>b){ t=a; a=b; b=t; }

if(a>c){ t=a; a=c; c=t; }

C语言常用算法归纳

C语言常用算法归纳

C语言常用算法归纳

应当掌握的一般算法

一、基本算法:

交换、累加、累乘

二、非数值计算常用经典算法:

穷举、排序(冒泡,选择)、查找(顺序即线性)

三、数值计算常用经典算法:

级数计算(直接、简接即递推)、一元非线性方程求根(牛顿迭代法、二分法)、定积分计算(矩形法、梯形法)

四、其他:

迭代、进制转换、矩阵转置、字符处理(统计、数字串、字母大小写转换、加密等)、整数各数位上数字的获取、辗转相除法求最大公约数(最小公倍数)、求最值、判断素数(各种变形)、数组元素的插入(删除)、二维数组的其他典型问题(方阵的特点、杨辉三角形)

详细讲解

一、基本算法

1.交换(两量交换借助第三者)

例1、任意读入两个整数,将二者的值交换后输出。

main()

{ int a,b,t;

scanf("%d%d",&a,&b);

printf("%d,%d\n",a,b);

t=a; a=b; b=t;

printf("%d,%d\n",a,b);

}

【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。

假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。

其中t为中间变量,起到“空杯子”的作用。

注意:三句赋值语句赋值号左右的各量之间的关系!

【应用】

例2、任意读入三个整数,然后按从小到大的顺序输出。

main()

{ int a,b,c,t;

scanf("%d%d%d",&a,&b,&c);

/*以下两个if语句使得a中存放的数最小*/

if(a>b){ t=a; a=b; b=t; }

if(a>c){ t=a; a=c; c=t; }

C语言常用算法

C语言常用算法

八、常用算法

(一)考核知识要点

1.交换、累加、累乘、求最大(小)值

2.穷举

3.排序(冒泡、插入、选择)

4.查找(顺序、折半)

5.级数计算(递推法)

6.一元方程求解(牛顿迭代法、二分法)

7.矩阵(转置)

8.定积分计算(矩形法、梯形法)

9.辗转相除法求最大公约数、判断素数

10.数制转换

(二)重点、难点精解

教材中给出的算法就不再赘述了。

1.基本操作:交换、累加、累乘

1)交换

交换算法的要领是“借助第三者”(如同交换两个杯子里的饮料,必须借助第三个空杯子)。例如,交换两个整型变量里的数值:int a=7,b=9,t;

t=a; a=b; b=t;

(不借助第三者,也能交换两个整型变量里的数值,但不通用,只是一个题目而已。

例如:int a=7,b=9; a=a+b; b=a-b; a=a-b;)

2)累加

累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。

3)累乘

累乘算法的要领是形如“s=s*A”的累乘式,此式必须出现在循环中才能被反复执行,从而实现累乘功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为1。

2.非数值计算常用经典算法

1)穷举法

也称为“枚举法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。

例如,用穷举法输出“将1元人民币兑换成1分、2分、5分硬币”的所有方法。

main()

{int y,e,w;

for(y=0;y<=100;y++)

《c语言数据结构》第9章 排序 自测卷 答案

《c语言数据结构》第9章   排序  自测卷  答案

第9章排序自测卷答案姓名班级

一、填空题(每空1分,共24分)

1. 大多数排序算法都有两个基本的操作:比较(两个关键字的大小)和移动(记录或改变指向记录的指

针)。

2.在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插入

到有序表时,为寻找插入位置至少需比较3次。(可约定为,从后向前比较)

3.在插入和选择排序中,若初始数据基本正序,则选用插入排序(到尾部);若初始数据基本反序,则选

用选择排序。

4.在堆排序和快速排序中,若初始记录接近正序或反序,则选用堆排序;若初始记录基本无序,则最好选

用快速排序。

5.对于n个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是O(n2)。若对其进行快速排序,在

最坏的情况下所需要的时间是O(n2)。

6.对于n个记录的集合进行归并排序,所需要的平均时间是O(nlog2n),所需要的附加空间是O(n)。7.【计研题2000】对于n个记录的表进行2路归并排序,整个归并排序需进行log2n趟(遍),共计移

动n log2n次记录。

(即移动到新表中的总次数!共log2n趟,每趟都要移动n个元素)

8.设要将序列(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;

C语言基本算法

C语言基本算法

C语言基本算法(简单级别)(总

14页)

--本页仅作为文档封面,使用时请直接删除即可--

--内页可以根据需求调整合适字体及大小--

一、基本

1.交换(两量交换借助第三者)

例1、任意读入两个整数,将二者的值交换后输出。

main()

{int a,b,t;

scanf("%d%d",&a,&b);

printf("%d,%d\n",a,b);

t=a; a=b; b=t;

printf("%d,%d\n",a,b);}

【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。

假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。

其中t为中间变量,起到“空杯子”的作用。

注意:三句赋值语句赋值号左右的各量之间的关系!

【应用】

例2、任意读入三个整数,然后按从小到大的顺序输出。

main()

{int a,b,c,t;

scanf("%d%d%d",&a,&b,&c);

/*以下两个if语句使得a中存放的数最小*/

if(a>b){ t=a; a=b; b=t; }

if(a>c){ t=a; a=c; c=t; }

/*以下if语句使得b中存放的数次小*/

if(b>c) { t=b; b=c; c=t; }

printf("%d,%d,%d\n",a,b,c);}

2.累加

累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复

执行,从而实现累加功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。

例1、求1+2+3+……+100的和。

C语言常用算法

C语言常用算法
例 1、任意读入 10 个整数,将其用冒泡法按升序排列后输出。
#define n 10 main()
{int a[n],i,j,t;
for(i=0;i<n;i++) scanf("%d",&a[i]); for(j=1;j<=n-1;j++) /*n 个数处理 n-1 趟*/
for(i=0;i<=n-1-j;i++) /*每趟比前一趟少比较一次*/
main()
{int i; long c;
c=1; i=1;
while(i<=10)
{c=c*i;
/*累乘式*/
i=i+1;
}
printf("1*2*3*...*10=%ld\n",c);}
二、非数值计算常用经典算法
1.穷举 也称为“枚举法”,即将可能出现的每一种情况一一测试,判断是否满足条件,一般采用循环来实现。 例 1、用穷举法输出所有的水仙花数(即这样的三位正整数:其每位数位上的数字的立方和与该数 相等,比如:13+53+33=153)。 [法一] main() {int x,g,s,b; for(x=100;x<=999;x++)
for(j=1;j<n;j++) /*将第 2 至第 10 个数一一有序插入到数组 a 中*/

数据结构第9章 排序

数据结构第9章 排序

数据结构第9章排序

数据结构第9章排序

第9章排名

本章主要内容:1、插入类排序算法2、交换类排序算法3、选择类排序算法4、归并

类排序算法5、基数类排序算法本章重点难点1、希尔排序2、快速排序3、堆排序

4.合并排序

9.1基本概念

1.关键字可以标识数据元素的数据项。如果一个数据项可以唯一地标识一个数据元素,那么它被称为主关键字;否则,它被称为次要关键字。

2.排序是把一组无序地数据元素按照关键字值递增(或递减)地重新排列。如果排

序依据的是主关键字,排序的结果将是唯一的。

3.排序算法的稳定性如果要排序的记录序列中多个数据元素的关键字值相同,且排序

后这些数据元素的相对顺序保持不变,则称排序算法稳定,否则称为不稳定。

4.内部排序与外部排序根据在排序过程中待排序的所有数据元素是否全部被放置在内

存中,可将排序方法分为内部排序和外部排序两大类。内部排序是指在排序的整个过程中,待排序的所有数据元素全部被放置在内存中;外部排序是指由于待排序的数据元素个数太多,不能同时放置在内存,而需要将

一部分数据元素放在内存中,另一部分放在外围设备上。整个排序过程需要在内存和

外存之间进行多次数据交换才能得到排序结果。本章仅讨论常用的内部排序方法。

5.排序的基本方法内部排序主要有5种方法:插入、交换、选择、归并和基数。

6.排序算法的效率评估排序算法的效率主要有两点:第一,在一定数据量的情况下,

算法执行所消耗的平均时间。对于排序操作,时间主要用于关键字之间的比较和数据元素

的移动。因此,我们可以认为一个有效的排序算法应该是尽可能少的比较和数据元素移动;第二个是执行算法所需的辅助存储空间。辅助存储空间是指在一定数据量的情况下,除了

C语言基本算法

C语言基本算法

C语言基本算法

C语言是一门用于编写计算机程序的高级编程语言,其特点是语法简洁、表达力强,广泛应用于科学计算、系统开发等领域。在C语言中,算

法是解决问题的关键,因此掌握基本算法对于学习和使用C语言非常重要。本文将介绍C语言中一些简单级别的基本算法。

1.顺序查找算法

顺序查找算法是一种简单的算法,用于在一个无序数组中查找目标元素。它的基本思想是逐个比较数组中的元素,如果找到目标元素则返回其

索引,否则返回-1

2.二分查找算法

二分查找算法是一种高效的算法,用于在一个有序数组中查找目标元素。它的基本思想是将数组分成两半,判断目标元素在哪一半中,然后再

在该半中进行查找,如此循环直到找到目标元素或确定不存在。

3.冒泡排序算法

冒泡排序算法是一种简单的排序算法,用于将一个无序数组按照升序

或降序排列。它的基本思想是从数组的第一个元素开始,两两比较相邻元

素的大小并交换位置,按照此规则不断遍历数组直到排序完成。

4.选择排序算法

选择排序算法是一种简单的排序算法,用于将一个无序数组按照升序

或降序排列。它的基本思想是从数组中选择最小(或最大)的元素并放置

到第一个位置,然后在剩余的元素中选择最小(或最大)的元素并放置到

第二个位置,如此循环直到排序完成。

5.插入排序算法

插入排序算法是一种简单的排序算法,用于将一个无序数组按照升序

或降序排列。它的基本思想是将数组分为已排序部分和未排序部分,每次

从未排序部分选取一个元素插入到已排序部分的适当位置,如此循环直到

排序完成。

6.计数排序算法

计数排序算法是一种简单的排序算法,适用于待排序的元素是有限个

C语言常用算法

C语言常用算法

C语言常用算法归纳

应当掌握的一般算法

一、基本算法:

交换、累加、累乘

二、非数值计算常用经典算法:

穷举、排序(冒泡,选择)、查找(顺序即线性)

三、数值计算常用经典算法:

级数计算(直接、简接即递推)、一元非线性方程求根(牛顿迭代法、二分法)、定积分计算(矩形法、梯形法)、矩阵转置

四、其他:

迭代、进制转换、字符处理(统计、数字串、字母大小写转换、加密等)、整数各数位上数字的获取、辗转相除法求最大公约数(最小公倍数)、求最值、判断素数(各种变形)、数组元素的插入(删除)、二维数组的其他典型问题(方阵的特点、杨辉三角形)

详细讲解

一、基本算法

1.交换(两量交换借助第三者)

例1、任意读入两个整数,将二者的值交换后输出。

main()

{int a,b,t;

scanf("%d%d",&a,&b);

printf("%d,%d\n",a,b);

t=a; a=b; b=t;

printf("%d,%d\n",a,b);}

【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。

假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。

其中t为中间变量,起到“空杯子”的作用。

注意:三句赋值语句赋值号左右的各量之间的关系!

【应用】

例2、任意读入三个整数,然后按从小到大的顺序输出。

main()

{int a,b,c,t;

scanf("%d%d%d",&a,&b,&c);

/*以下两个if语句使得a中存放的数最小*/

if(a>b){ t=a; a=b; b=t; }

if(a>c){ t=a; a=c; c=t; }

一种快速排序算法的C语言实现

一种快速排序算法的C语言实现
巧, 甚至 不需 要额 外 的存储 空 间 。 例如, 交换 A和 B的
基金 项 目: 湖南省教 育厅 一般科研项 目资.  ̄( 1 2 C0 8 6 3 )
上节讨论的冒泡排序法算法简单,空间效率好 ,
2 0 1 3 年 第1 1 期 I 福建电脑 ・ 5 7 ・









些复 杂算 法 的运行 效率 大大 提 高 。
素, 则交 换这 两个 元 素 的位 置 ; 现在 , 前 2个 元素 中较
内部排序完全在计算机 内存 中进行, 是一种高速 大 的 处在 第 2个 位 置 ,然 后 比较 第 2个 和 第 3个 元 的数据运算 , 其算法灵活多变 , 不 同算法的时间复杂 素 , 如 果第 2个 元 素 大 于 第 3个 原 则 , 则 交 换第 2个
3选择 类排 序
( 2 ) 接 下 来 按照 ( 1 ) 的 算 法对 前 n 一 1个 元 素进 行 两两 比较 , 调整 逆序 。这一 步完 成后 , 第二 大 的元素将
处在第 1 1 — 1的位 置 。
选择 类 排序 是 一 种 常见 的排 序 方 式 , 它 的 思想 是
( 3 ) 依 照第 ( 2 )的规 则 , 逐一 对前 n 一 2 、 前 n 一 3 、

c语言几种数组排序方法

c语言几种数组排序方法

常用的c语言排序算法主要有三种即冒泡法排序、选择法排序、插入法排序。

一、冒泡排序冒泡排序:

是从第一个数开始,依次往后比较,在满足判断条件下进行交换。代码实现(以降序排序为例)

#include<stdio.h>

int main()

{

int array[10] = { 6,9,7,8,5,3,4,0,1,2 };

int temp;

for (int i = 0; i < 10; i++)

{//循环次数

for (int j = 0; j <10 - i-1; j++)

{

if (array[j] < array[j+1])

{//前面一个数比后面的数大时发生交换temp = array[j];

array[j] = array[j+1];

array[j + 1] = temp;

}

}

} //打印数组for (int i = 0; i < 10; i++) printf("%2d", array[i]); return 0;}}

二、选择排序以升序排序为例:

就是在指定下标的数组元素往后(指定下标的元素往往是从第一个元素开始,然后依次往后),找出除指定下标元素外的值与指定元素进行对比,满足条件就进行交换。与冒泡排序的区别可以理解为冒泡排序是相邻的两个值对比,而选择

排序是遍历数组,找出数组元素与指定的数组元素进行对比。(以升序为例)

#include<stdio.h>

int main()

{

int array[10] = { 6,9,7,8,5,3,4,0,1,2 };

C语言常见排序算法

C语言常见排序算法
16
6.1.3 直接插入排序
算法描述:
记录存放在数组R[0….n-1]中,排序过程的某一中间时刻,R被划分 成两个子区间R[0…i-1]和R[i….n-1],其中:前一个子区间是已排好 序的有序区;后一个子区间则是当前未排序的部分。
基本操作
将当前无序区的第1个记录R[i]插入到有序区R[0….i-1]中适当的位置 ,使R[0…i]变为新的有序区
49 25* 16 21
2
3
4
5
j 49 25
08
25
49
25*
16
21
ik
j 25* 25
08
25
49
25*
16
21
6.1.5 选择排序
算法实例:
08
25
49
25* 16
21
0
1
2
3
4
5
21 16
i
k
j
k 指示当前序列中最小者
6.1.5 选择排序
算法实现:
输入n 个数给a[1] 到 a[n] for i=1 to n-1
6.1.1 冒泡排序
算法实例
21
21
21
21
16
08
25
25
25
16
08
16
49

c语言十大经典排序

c语言十大经典排序

c语言十大经典排序

1、冒泡排序

冒泡排序是最常用的排序算法之一,它通过不断比较相邻的元素大小,并按照规定的顺序交换它们,从而将最大(或最小)的元素逐渐"冒泡"到列表的末尾。经过多轮迭代后,整个列表便被排序完成。

2、选择排序

选择排序是一种简单直观的排序算法,它将列表分为已排序和未排序两部分,每次从未排序部分选择最小(或最大)的元素,并将其放到已排序部分的末尾,直至整个列表排序完成。

3、插入排序

插入排序的基本思想是将待排序列表分为已排序和未排序两部分,每次从未排序部分选择一个元素,并将其插入到已排序部分的适当位置,最终完成排序。

4、希尔排序

希尔排序是一种改进的插入排序算法,它通过将列表进行分组,并对每个分组进行插入排序,随着排序继续进行,分组的大小逐渐减小,直至变为1,即完成最终的排序。

5、快速排序

快速排序是一种高效的排序算法,它采用分治的思想,通过选择

一个基准元素,将列表分为两部分,左边部分的元素都小于等于基准

元素,右边部分的元素都大于等于基准元素,然后对左右两部分分别

进行快速排序,最终完成整个列表的排序。

6、归并排序

归并排序利用了分治的思想,将待排序列表递归地分成两个子列表,分别进行排序,然后再将排序好的子列表合并成一个有序列表。

7、堆排序

堆排序利用了完全二叉堆的数据结构,通过建立最大堆(或最小堆)来进行排序。堆排序的主要步骤包括建堆、交换堆顶元素和调整

堆的过程,最终实现排序效果。

8、计数排序

计数排序是一种非比较排序算法,它通过确定每个元素之前有多

少个元素小于它,来确定每个元素的位置。计数排序适用于一定范围

c语言运算符优先级排序

c语言运算符优先级排序

c语言运算符优先级排序

C语言中的运算符优先级规定了表达式中各部分计算的顺序。了解这个优先级顺序对于编写正确和易于理解的代码非常重要。以下是C语言中运算符的优先级排序,从最高优先级到最低优先级:

1. 括号 `()`:用于函数调用和表达式分组。

2. 数组下标 `[]`:数组访问。

3. 结构体成员访问 `.` 和 `->`:直接和间接成员访问。

4. 一元运算符:

- 递增和递减 `++`, `--`

- 逻辑非 `!` 和位非 `~`

- 一元加号和减号 `+`, `-`

- 强制类型转换和取地址 `&` 和取值 `*`

5. 乘法 `*`、除法 `/` 和取模 `%`。

6. 加法 `+` 和减法 `-`。

7. 位移运算符 `<<` 和 `>>`。

8. 关系运算符:

- 小于 `<`、大于 `>`

- 小于等于 `<=`、大于等于 `>=`

9. 相等和不等运算符 `==` 和 `!=`。

10. 位与 `&`。

11. 位异或 `^`。

12. 位或 `|`。

13. 逻辑与 `&&`。

14. 逻辑或 `||`。

15. 条件运算符 `?:`。

16. 赋值运算符:`=`,以及复合赋值运算符 `+=`,`-=`,`*=`,`/=`,`%=`,`<<=`,`>>=`,`&=`,`^=`,`|=`。

17. 逗号运算符 `,`:用于分隔表达式,使其按顺序执行。

理解和掌握这些优先级是非常重要的,因为它们决定了复杂表达式中各部分的计算顺序。在编写代码时,如果对运算符优先级不太确定,最好使用括号来明确表达式中运算的顺序,以增加代码的清晰度和准确性。

C语言常用9种算法

C语言常用9种算法

C语言常用9种算法

C语言是一门广泛应用于编程领域的语言,具有丰富的算法库和功能。在C语言中,有许多常用的算法可以帮助程序员解决各种问题。本文将介

绍C语言中常用的9种算法,以帮助读者深入了解和应用这些算法。

1.顺序算法:

顺序算法是一种简单但有效的方法,通过逐个比较目标元素和数组中

的元素来寻找指定值。该算法适用于小规模的数据集,时间复杂度为

O(n)。

2.二分算法:

二分算法是一种高效的方法,适用于已排序的数组。该算法通过将目

标值与数组的中间元素进行比较,并根据比较结果将范围缩小一半。时间

复杂度为O(log n)。

3.冒泡排序算法:

冒泡排序算法是一种简单但低效的排序方法,通过反复交换相邻的元

素将较大的元素逐渐移至数组的末尾。时间复杂度为O(n^2)。

4.选择排序算法:

选择排序算法是一种简单但较为高效的排序方法,通过找到最小元素

并将其放置在数组的起始位置,逐个选择剩余元素中的最小值,直到完成

排序。时间复杂度为O(n^2)。

5.插入排序算法:

插入排序算法是一种简单而且对小数据集很有效的排序方法,通过将未排序的元素依次插入已排序的序列中,逐步构建有序的序列。时间复杂度为O(n^2)。

6.快速排序算法:

快速排序算法是一种高效的排序方法,通过选择一个基准值将数组分割成两个子数组,较小的值放在基准值的左边,较大的值放在右边。然后对子数组进行递归排序。时间复杂度为O(n log n)。

7.归并排序算法:

归并排序算法是一种稳定而且高效的排序方法,通过将数组递归地分成两个子数组,然后合并这些子数组以得到排序结果。时间复杂度为O(n log n)。

快速排序(C语言)-解析

快速排序(C语言)-解析

快速排序(C语⾔)-解析

快速排序

快速排序是⼀种排序算法,对包含 n 个数的输⼊数组,最坏情况运⾏时间为O(n2)。虽然这个最坏情况运⾏时间⽐较差,但快速排序通常是⽤于排序的最佳的实⽤选择,

这是因为其平均性能相当好:期望的运⾏时间为O(nlgn),且O(nlgn)记号中隐含的常数因⼦很⼩。另外,它还能够进⾏就地排序,在虚存环境中也能很好的⼯作。

快速排序(Quicksort)是对的⼀种改进。

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过⼀趟排序将要排序的数据分割成独⽴的两部分,其中⼀部分的所有数据都⽐另外⼀部分的所有数据都要⼩,然后再按此⽅法对这两部分数据分别进⾏快速排序,整个排序过程可以进⾏,以此达到整个数据变成有序。

像合并排序⼀样,快速排序也是采⽤分治模式的。下⾯是对⼀个典型数组A[p……r]排序的分治过程的三个步骤:

分解:

数组 A[p……r]被划分为两个(可能空)⼦数组 A[p……q-1] 和 A[q+1……r] ,使得 A[p……q-1] 中的每个元素都⼩于等于 A(q) , ⽽且,⼩于等于 A[q+1……r] 中的元素。⼩标q也在这个划分过程中进⾏计算。

解决:

通过递归调⽤快速排序,对于数组 A[p……q-1] 和 A[q+1……r] 排序。

合并:

因为两个⼦数组是就地排序的,将它们的合并不需要操作:整个数组 A[p……r] 已排序。

下⾯的过程实现快速排序(伪代码):

QUICK SORT(A,p,r)

1if p<r

2 then q<-PARTITION(A,p,r)

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

C语言9种常用排序法

1.冒泡排序

2.选择排序

3.插入排序

4.快速排序

5.希尔排序

6.归并排序

7.堆排序

8.带哨兵的直接插入排序

9.基数排序

例子:乱序输入n个数,输出从小到大排序后的结果1.冒泡排序

#include

int main()

{

int i, j, n, a[100], temp;

while(scanf("%d",&n)!=EOF)

{

for(i=0;i

scanf("%d",&a[i]);

for(i=0;i

{

for(j=0;j

{

if(a[j]>a[j+1]) //比较a[j]与a[j+1],使a[j+1]大于a[j] {

temp = a[j+1];

a[j+1] = a[j];

a[j] = temp;

}

}

}

for(i=0;i

printf("%d ",a[i]);

printf("\n");

}

return 0;

}

2.选择排序

#include

int main()

{

int i, j, n, a[100], t, temp;

while(scanf("%d",&n)!=EOF)

{

for(i=0;i

scanf("%d",&a[i]);

for(i=0;i

{

t = i;

for(j=i+1;j

if(a[t]>a[j])

t = j;

}

temp = a[i];

a[i] = a[t];

a[t] = temp;

}

for(i=0;i

printf("%d ",a[i]);

printf("\n");

}

return 0;

}

3.快速排序

/*

1.假设数组为a[n];

2.第一次排序过程如下:

取x = 0 ( a[0]为中轴 );

i=0 (第一个元素下标), j=n-1(最后一个元素下标);

重复下面过程:(直到i>=j)

{

从a[j]起,向前找小于a[x]的元素,同时j--,找到后,a[j]与a[x]交换,x=j;

从a[i]起,向后找大于a[x]的元素,同时i++,找到后,a[i]与a[x]交换,x=i; }

3.注意快排函数是迭代函数,必须要有结束条件 (因为忽略结束条件,调试了很久......)

4.再对a[low]~a[x-1]、a[x+1]~a[high]分别调用快排函数

*/

#include

void quicksort(int a[],int low,int high);

int main()

{

int i, n, a[100];

while(scanf("%d",&n)!=EOF)

{

for(i=0;i

scanf("%d",&a[i]);

quicksort(a,0,n-1);

for(i=0;i

printf("%d ",a[i]);

printf("\n");

}

return 0;

}

void quicksort(int a[],int low,int high)

{

if(low>=high) return; //坑爹的结束条件,return后面不能跟数值 int i=low, j= high, x=i, temp;

while(i

{

for(;a[j]>=a[x]&&i

if(i

{

temp = a[j];

a[j] = a[i];

a[i] = temp;

x = j;

i++;

}

else

break; //i>=j即可跳出本次while循环

for(;a[i]<=a[x]&&i

if(i

{

temp = a[i];

a[j] = temp;

x = i;

j--;

}

else

break; //跳出本次while循环 }

quicksort(a,low,x-1);

quicksort(a,x+1,high);

}

4.插入排序法

#include

void show(int a[],int n) //输出数组

{

int i;

for(i=0;i

printf("%d ",a[i]);

printf("\n");

}

void insertsort(int a[],int n);

int main()

{

相关文档
最新文档