第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;
7 for (i=0; i<N; i++) cin>>A[i];
8 for(j=0 ; j<N-1 ; j++)
9 for(i=0 ; i<N-1-j; i++)
10 if(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 }
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c66dab52f25546b98d2f25bd236674dd.png)
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)
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++) {
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 }
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/488347803dc84efb82cfd1c2deb3f878.png)
2.用数组解决查找问题
3、顺序查找法
►顺序查找--的基本思想是让关键字与序列中的数逐个比较,直到找出与给定关键字相同的数为止或序列结束,一般应用
于无序序列查找。
【例16.3】顺序查找
1 #include <iostream>
2 using namespace std;
3 int Search(int A[],int n,int find)
4 {
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 {
5 int low,upper,mid;
6 low=0 , upper=n-1;
7 while(low<=upper) {
8 mid = low + (upper-low)/2;
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 }