当前位置:文档之家› 常见三种排序方法PPT参考课件

常见三种排序方法PPT参考课件

(2) 除第1个数外,其余n-1个数再按(1)的方法选出 次小的数,与第2个数交换位置;
(3) 重复(1)n-1遍,最后构成递增序列。
实现方法:采用双重循环(循环的嵌套)
外循环为i:控制排序趟数 内循环为j:第i趟排序过程中的下标变量
C Programming Language
6
实现方法:采用双重循环(循环的嵌套)
C Programming Language
9
交换排序:俩俩比较待排序记录的键值,若逆序,则交换, 直 到全部满足为止
25 25 25 25 11 11 11
56 49 49 11 25 25 25
(2)冒泡排序 49 56 11 49 41 36 36
78 11 56 41 36 41
for(j = i + 1;j < N;j++) if(a[k] > a[j]) k = j; if(k != i) { t = a[k]; a[k] = a[i]; a[i] = t; } } for(i = 0;i<N;i++) printf("%5d",a[i]); printf("\n");
}
C Programming Language
8
第二种:“冒泡法”(由小到大排序)
基本思想:
(1)从第一个元素开始,对数组中两两相邻的元素 比较,将值较小的元素放在前面,值较大的元素 放在后面,一轮比较完毕,最大的数存放在a[N-1] 中;
(2)然后对a[0]到a[N-2]的N-1个数进行同(1)的 操作,次最大数放入a[N-2]元素内,完成第二趟 排序;依次类推,进行N-1趟排序后,所有数均有 序。
C Programming Language
13
关键代码:
for(i= 1 ; i< n ; i++) for(j=0 ; j< n-i ; j++)
if(a[j]>a[j+1]){ t=a[j];a[j]=a[j+1];a[j+1]=t;}
注意排序堂数i
注意i的边界
的初值
“选择”排序法的结构形式:
K是记下最值的下标
for(i=0;i<n-1;i++)
{ k=i;
K不在本次排序中的位置
for(j=i+1;j<n;j++)
if(a[k]>a[j]) k=j;
if(k!=i)
{t=a[i];a[i]=a[k];a[k]=t;}
}
C Programming Language
C Programming Language
11
冒泡法排序
用冒泡法对10个数排序(由小到大)。
422222 844444 285555 758777 577888 999999
C Programming Language
12
冒泡排序的结构形式(递增)
for(i=0;i<N-1;i++) for(j=0;j<N-i-1; j++) if(a[j]>a[j+1]){t=a[j]; a[j]=a[j+1]; a[j+1]=t;}
11 65 41 36 49
65 41 36 56
41 36 65
36 78
初第第第第第第





















C Programming Languag字e





序 10
后后后后后后
交 换 排 序——“ 冒泡”排序法 特点:逐个对数组中每相邻二数进行比较,若条件满
足,则互相交换,否则保持原位置不变。
数组操作
(1) 选择排序法 (2)冒泡排序法 (3)比较排序法 (1)顺序查找法 (2)折半查找法
(1)数组元素插入 (2)数组元素删除
C Programming Language
1
(1)选择排序——第17、26套的填空题
简单选择排序: 从1到n 选出关键值最(大)小的记录
k=j
k=1
29 71 58 54 31
i=1 k=2 j=3
k=j
第 二

29 71 58 54 31
i=1
k=3 j=4
29 71 58 54 31
i=1
k=4
k=j k!=i,交换
互换
29 31 58 54 71
C Programming Language
4
29 31 58 54 71
i=2 j=3
排序过程:(设数据存于A数组中,n个数据,按递增 次序排序)
A[0]与A[1]比较 A[0]<A(1) 不换,否则对调 A[1]与A[2]比较 A[1]<A[2] 不换,否则对调 : A[n-2]与A[n-1]比较 A[n-2]<A[n-1] 不换,否则对调
千万要注意!! 若有n个数据,需要进行i=n-1轮比较 。每轮中比较 的次数为j=n-i+1 次。
,交换到第一个位置上,然后从2到n选 出键值最(大)小的记录,交换到第 二个位置上,….
C Programming Language
2
用选择法对数组 int a[5]={ 54,71,58,29,31 }进行升序排序
数组下标 0 1 2 3 4
初态 i=0 54 71 58 29 31
k=0 j=1
7
#include <stdio.h> #include "stdlib.h" void main() {
const int N = 10; int i,j,k,t,a[N]; for(i = 0;i < N;i++) { a[i]=rand()%61;
printf("%d,",a[i]);} printf("\n"); for(i = 0; i < N-1;i++) { k = i;
54 71 58 29 329 31
k=0
j=3
54 71 58 29 31
i=0
k=3 j=4
互换
C Programming Language
判断a[j]<a[k]?
k=j
第 一

k!=i,交换
3
29 71 58 54 31 判断a[j]<a[k]?
i=1 j=2
k=2
29 31 58 54 71
i=2 k=3 j=4
互换
29 31 54 58 71
i=3 j=4 k=3
判断a[j]<a[k]?
第 三 趟
k!=i,交换
k =i,不交换
第 四

C Programming Language
5
“选择排序法” (由小到大排序) 选择法(递增) 基本思想:
(1) 从n个数的序列中选出最小的数,与第1个数交 换位置;
相关主题