当前位置:文档之家› 常见三种排序方法

常见三种排序方法

止。
C Programming Language 20
折半查找(二分法查找)
下标 0
( 08, ( 08, ( 08,
1
14, 14,
2
23, 23, 23,
3
37, 37, 37,
4
46,
5
55, 55, 55,
6
68, 68, 68,
7
79, 79, 79,
8
91 )
low low
mid
46, 46,
high
91 ) 91 )
mid
14,
high= mid-1
low high mid
( 08,
14,
23,
37,
46,
55,
68,
79,
91 )
low
( 08, ( 08, 14, 14, 23, 23, 37, 37,
mid
46, 46, 55, 68, 79, 79,
high
91 )
low
55,
int Search(long a[ ], int n, long x) { int i; for (i=0; i<n; i++) { if (a[i] == x) { return (i); } } return (-1); }
C Programming Language 18
2、二分法查找/折半查找:
k=3 j=4
29 71
i=1
31
k=4
29 31 58
C Programming Language
54 71
4
判断a[j]<a[k]?
29 31 58
i=2 k=2
54 71
j=3 第 三 趟
29 31 58
i=2
互换
54 71
k=3 j=4
k!=i,交换
29 31 54
58 71
i=3 k=3 j=4
冒泡法排序
用冒泡法对10个数排序(由小到大)。
4 8 2 7 5 9
C Programming Language
2 4 8 5 7 9
2 4 5 8 7 9
2 4 5 7 8 9
2 4 5 7 8 9
2 4 5 7 8 9
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;}
到将第i个位置腾出。 (a[i+1]=a[i])
第三种:比较排序(上机19、52套编程题)
注意排序堂数i 的初值

注意i的边界
for(i= 0 ; i< n -1 ; i++) for(j=i+1 ; j< n ; j++) if(a[i]>a[j]){ t=a[i];a[i]=a[j];a[j]=t;}
注意a[i]不a[j] 比较 C Programming Language
注意j的边界
16
补充知识一:查找
查找的方法很多。 如:顺序查找、二分法查找等等。
1、顺序查找: 最简单的查找方法,基本思想是利用循 环顺序扫描整个数组,依次将每个元素 与待查找值比较,直至找到或找不到。
C Programming Language
17
• 对于无序数组,顺序查找是唯一可行的办法
• 对大批量数据用顺序查找占机器时间较多。
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
19
查找过程:
(1) 将数列对分,找出中间数据
(2) 用此数据与要查的数据比较
(3) 数值相等则结束查询,否则确定要查的数
据所在区间,逐步缩小查找范围,每次将
数列区间缩小一半,直到找到或找不到为
C Programming Language
23
#include <stdio.h> main( ) { int up=9, low=0, mid, found=0, find; int a[10]={1, 5, 6, 9, 11, 17, 25, 34, 38, 41}; scanf(〞%d 〞, &find); printf(〞\n 〞); while (up>=low && !found) { mid=(up+low)/2; if(a[mid]==find) { found=1; break; } else if(a[mid]>find) up=mid-1; else low=mid+1; } if(found) printf(〞found number is %dth 〞mid); else printf(〞no found 〞); }
数组操作
(1) 选择排序法 (2)冒泡排序法 (3)比较排序法 (1)顺序查找法 (2)折半查找法

(1)数组元素插入 (2)数组元素删除

C Programming Language 1
(1)选择排序——第17、26套的填空题
简单选择排序: 从1到n 选出关键值最(大)小的记录 ,交换到第一个位置上,然后从2到n选 出键值最(大)小的记录,交换到第 二个位置上,….
(2)冒泡排序
56 49 78
11
65 41 36uage 字
65
41 36 78
第 一 趟 排 序 后
41
36 65
第 二 趟 排 序 后
36
56
49
第 三 趟 排 序 后
第 四 趟 排 序 后
第 五 趟 排 序 后
第 六 趟 排 序 后
10
交 换 排 序——“ 冒泡”排序法 特点:逐个对数组中每相邻二数进行比较,若条件满 足,则互相交换,否则保持原位置不变。 排序过程:(设数据存于A数组中,n个数据,按递增 次序排序)


实现方法:采用双重循环(循环的嵌套)
外循环为i:控制排序趟数 内循环为j:第i趟排序过程中的下标变量
C Programming Language
6
“选择”排序法的结构形式:
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;}
k =i,不交换
第 四 趟
C Programming Language
5
“选择排序法” (由小到大排序) 选择法(递增) 基本思想:



(1) 从n个数的序列中选出最小的数,与第1个数交 换位置; (2) 除第1个数外,其余n-1个数再按(1)的方法选出 次小的数,与第2个数交换位置; (3) 重复(1)n-1遍,最后构成递增序列。
22
C Programming Language
int BinSearch(long a[],int n,long x) { int low, high, mid; low = 0; high = n - 1; while (low <= high) { mid = (high + low) / 2; if(x > a[mid]) {low = mid + 1;} else if(x < a[mid]){high = mid - 1;} else {return (mid);} } return(-1); }


实现方法:采用双重循环(循环的嵌套)
C Programming Language
9
交换排序:俩俩比较待排序记录的键值,若逆序,则交换, 直到全部满足为止
25 25 49 56 11 25 49 11 56 25 11 49 41 11 25 41 36 11 25 36 41 11 25 36
k=0
第 一 趟
54 71 58
i=0
互换
29
k=3
31
j=4
C Programming Language
3
29
71
i=1 k=1
58 54 31
j=2
判断a[j]<a[k]?
k=j
第 二 趟
29
71
i=1
58 54 31
k=2 j=3
k=j
29 71
i=1
58 58
互换
54 54
31
k=j k!=i,交换
C Programming Language
2
用选择法对数组 int a[5]={ 54,71,58,29,31 }进行升序排序
数组下标
初态 i=0
0
1
2
3
4
54 71 58
相关主题