第16节 数组的应用(冒泡排序、选择选择、顺序查找法、二分查找法)

第16讲 数组的应用

1.用数组解决排序问题
1、冒泡排序
►排序问题是程序设计中的典型问题,它有很广泛的应用,其功能是将一个数据元素序列的无序序列调整为有序序列。
    
►冒泡排序法(bubble sort)的基本思想是通过相邻两个记录之间的比较和交换,使关键码较小的记录逐渐从底部移向
		  顶部(上升),关键码较大的记录逐渐从顶部移向底部(沉底),冒泡由此得名。设由A[1]~A[n]组成的n
    	  个数据,冒泡排序的过程可以描述为:
    【例16.1】冒泡排序
    1 #include <iostream> 
    2 using namespace std; 
    3 #define N 10 //数组元素个数 
    4 int main() 
    5 { 
    6 	int A[N], i, j, t; //注意数组下标从0开始 
    7 	for (i=0; i<N; i++) cin>>A[i]; //输入N个数 
    8 	for(j=0 ; j<N-1 ; j++) //冒泡排序法 
    9 		for(i=0 ; i<N-1-j; i++) //一趟冒泡排序 
    10 			if(A[i] > A[i+1]) //A[i]与A[i+1]比较 <升序 >降序 
    11 				t=A[i], A[i]=A[i+1], A[i+1]=t; //交换 
    12 	for (i=0; i<N; i++) cout<<A[i]<<" "; //输出排序结果 
    13 	return 0; 
    14 }
        /*
        j=0: i=0~8 
        j=1: i=0~7 
        j=2: i=0~6 
        ……
        j=8: i=0
        */
    

在这里插入图片描述

2、选择排序
►选择排序法(selection sort)的基本思想是第i趟选择排序通过n-i次关键码的比较,从n-i+1个记录中选出关键码
    	  最小的记录,并和第i个记录进行交换。设由A[1]~A[n]组成的n个数据,选择排序的过程可以描述为:
    【例16.2】选择排序
        1 #include <iostream> 
        2 #include <ctime> 
        3 using namespace std; 
        4 void SelectionSort(int A[],int n) //选择排序n为数组元素个数 
        5 { 
        6 int i,j,k,t; 
        7 for(i=0; i<n-1; i++) { //选择排序法 
        8     k=i; 
        9     for(j=i+1; j<n; j++) //一趟选择排序 
       10         if (A[j] < A[k]) k=j; //<升序 >降序 
       11      if(i!=k) t=A[i], A[i]=A[k], A[k]=t; 
       12     } 
       13 }
       14 #define N 10 
       15 int main() 
       16 { 
       17 	int A[N],i; 
       18 	srand((unsigned int)time(0)); //设置随机数种子 
       19 	for(i=0; i<N; i++) { //随机产生N个数 
       20 		A[i] = rand()%100; 
       21 		cout<<A[i]<<" "; 
       22 	} 
       23 	cout<<endl; 
       24 	SelectionSort(A,N); 
       25 	for(i=0; i<N; i++) cout<<A[i]<<" "; //输出排序结果 
       26 	return 0; 
       27 }
            /*
            i=0: j=1~9 A[i]←→A[k] 
            i=1: j=2~9 A[i]←→A[k] 
            i=2: j=3~9 A[i]←→A[k] 
            ……
            i=8: j=9 A[i]←→A[k]
            */

在这里插入图片描述

2.用数组解决查找问题
3、顺序查找法
►顺序查找--的基本思想是让关键字与序列中的数逐个比较,直到找出与给定关键字相同的数为止或序列结束,一般应用
		 于无序序列查找。
    【例16.3】顺序查找
    1 #include <iostream> 
    2 using namespace std; 
    3 int Search(int A[],int n,int find) 
    4 { //顺序查找 n=序列元素个数 find=欲查找数据 
    5 		int i; 
    6 		for (i=0; i<n ; i++) if (A[i]==find) return i; 
    7 		return -1; //未找到 
    8 } 
    9 #define N 10 
    10 int main() 
    11 { 
    12 		int A[N]={18,-3,-12,34,101,211,12,90,77,45}, i,find; 
    13 		cin>>find; 
    14 		i=Search(A,N,find); 
    15 		if(i>=0) cout<<"A["<<i<<"]="<<find<<endl; 
    16 		else cout<<"not found"<<endl; 
    17 		return 0; 
    18 }
4、二分查找法
►二分查找法--对于有序序列,可以采用二分查找法进行查找。它的基本思想是:升序排列的n个元素集合A分成个数大致相
		   同的两部分,取A[n/2]与欲查找的find作比较,如果相等则表示找到find,算法终止。如果find<A[n/2],
   		   则在A的前半部继续搜索find,如果find>A[n/2],则在A的后半部继续搜索find。
        【例16.4】二分查找
        1 #include <iostream> 
        2 using namespace std; 
        3 int BinarySearch(int A[],int n,int find) 
        4 { //二分查找 n=序列元素个数 find=欲查找数据 
        5 int low,upper,mid; 
        6 low=0 , upper=n-1; //左右两部分 
        7 while(low<=upper) { 
        8 mid = low + (upper-low)/2; //不用(upper+low)/2,避免upper+low溢出 
        9 if( A[mid] < find) low = mid+1; //右半部分 
       10 else if (A[mid] > find) upper = mid - 1; //左半部分 
       11 else return mid; //找到 
       12 } 
       13 return -1; //未找到 
       14 }
       15 #define N 10 
       16 int main() 
       17 { 
       18 		int A[N]={8,24,30,47,62,68,83,90,92,95},i,find; 
       19 		cin>>find; 
       20 		i=BinarySearch(A,N,find); 
       21 		if(i >= 0) cout<<"A["<<i<<"]="<<find<<endl; 
       22 		else cout<<"not found"<<endl; 
       23 		return 0; 
       24 }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值