例题:自定义函数,从键盘输入N个数,对它进行从小到大的排序,要求从主函数输出排序的结果。
方法一:冒泡排序法
#include<iostream>
#define N 10
using namespace std;
int main()
{
void bubble_sort(int a[]);
int a[N], i;
cout << "please input 10 numbers:";
for (i = 0; i < N; i++)
cin >> a[i];
bubble_sort(a);
for (i = 0; i < N; i++)
cout << a[i] << " ";
return 0;
}
void bubble_sort( int a[])
{
int i, j, temp;
for(i=0;i<N-1;i++)
for (j = 0; j < N - i - 1; j++)
{
if (a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
冒泡排序法分析:
- 先从第一个元素开始,各位相邻元素经过一一比较,最后把最大或者最小的元素排在最后一位。
- 在经过第一轮比较后,此时已将最大的元素放在最后一位(对于本题,按从小到大的顺序排序),此时各位相邻元素比较的次数为(N-1)。
- 再进行第二轮比较,由于最大的元素已经确定放在最后一位,所以无须再进行涉及最后一位元素的元素比较,此时实际比较的次数为(N-1)-1。
- 以此类推,可知最终比较的轮数为N-1,每轮比较的次数为(N-1)-i,其中i为第i次轮数比较,但i从0开始。
方法二:选择排序法
#include<iostream>
#define N 10
using namespace std;
int main()
{
int select_sort(int a[]);
int a[N], i;
cout << "please input 10 numbers:";
for (i = 0; i < N; i++)
cin >> a[i];
select_sort(a);
for (i = 0; i < N; i++)
cout << a[i] << " ";
return 0;
}
void select_sort(int a[])
{
int i, j,temp;
for(i=0;i<N-1;i++)
for (j = i + 1; j < N; j++)
{
if (a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
选择排序法分析:
- 先设第一个元素为最大者,与它后几位元素进行比较,(按本题从小到大排序)如果有大于第一个元素的元素,则将它们进行相互替换,最后已将最小的元素放在第一位,这一点与冒泡排序法不同,冒泡排序法是将最大的元素放在未尾。
- 在经过第一轮比较后,已将最小的元素放在第一位,此时第一位元素与其后几位元素比较的次数为N-1次。
- 再进行第二轮比较,设第二位元素为次小元素,如果有大于它的元素,则将它们进行相互替换,由于最小的元素已经确定放在第一位,所以无须再进行涉及第一位元素的比较,此时比较的次数为N-1-1。
- 以此类推,可知最终比较的轮数为N-1次,每轮比较的次数为N-1-i次,i也是从0开始的。