方法一:冒泡排序法(bubble sort)
其基本思想是通过相邻两个记录(数据)之间的比较和交换,使关键码较小的记录逐渐从底部移向顶部(上升),关键码较大的记录逐渐从顶部移向底部(沉底),冒泡由此得名。设由A[1]~A[n]组成的n个数据。
即:两两比较(n-1+1)/2次,小的放小的里.
以7个数据为例,第一趟交换比较6次,第二趟交换比较5次以此类推。
容易知道当有n个无序数据要进行排序时,要进行n-1轮的比较,第x轮比较要进行n-x次的数据的两两交换。
eg:输入10给整数,将其排序:
#include<iostream>
using namespace std;
int main()
{
int a[11];
int i,j,t;
for (i = 1; i <= 10; i++)//输入10个数组元素,使a[0]被系统随机赋初值,其余数组元素逐个输入
cin >> a[i];
cout << endl;
for(j=1;j<=9;j++)//10个数要进行10-1轮的比较
for (i = 1; i <=10-j ; i++)//第j轮进行10-j次的两两比较交换
{
if (a[i+1] >a[i ]){t = a[i ]; a[i] = a[i+1]; a[i+1] = t;//如果后一个数组元素大于前一个那么两个元素大小交换
}
}
for (i = 1; i <= 10; i++)//输出数组元素,由大到小,也可以调整为a[i]>a[i+1]那么由小到大输出
cout << a[i] << " ";
return 0;
}
方法二:选择排序法(selection sort)
其基本思想是第i趟选择排序通过n-i次关键码的比较,从n-i+1个记录中选出关键码最小的记录,并和第1个记录进行交换。设由A[1]~A[n]组成的n个数据。
即将每一轮的最小值与a[0]对调,第二轮的最小值与a[1]对调,以此类推,每一轮求最小值要比较n-轮次(n为数据个数)
以7个数据为例:
eg.输入10个数将其排序
#include<iostream>
using namespace std;
int main()
{
void s(int a[], int n);
int a[10], i;
for (i = 0; i <= 9; i++)//输入要排序的十个数
cin >> a[i];
s(a, 10);//调用函数s来进行选择排序
for (i = 0; i <= 9; i++)//经过调用后a数组已经排序完成
cout << a[i] << ' ';
return 0;
}
void s(int a[], int n)
{
int i, j, k=0, t;
for (i = 0; i < n - 1; i++)//经过9轮比较
{
k = i;//k其实是用来存储数组中最小元素的下标,这里认为a[0]为最小值
for (j = i + 1; j < n; j++)//第一轮这个循环找出数组元素的最小值,第二轮循环找出除了a[0】的数组元素的最小值,以此类推
if (a[j] < a[k])k = j;//每一个数与a[0]比较,用k存储最小值的下标
t = a[k]; a[k] = a[i], a[i] = t;//第一次将数组元素的最小值与a[0]对换,第二次将第二轮的最小值与a[1]对换
}