排序
1. 直接选择排序法
如果要将数据按照非递减序排列,一般的过程是先找到整个数组中最小的元素,并把它放在数组的起始位置,然后在剩下的元素中找最小的并把它放在第二个位置上,对整个数组继续这个过程,最后将得到按从小到大顺序排列的数组。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int lh, rh, k, tmp;
int array[] = { 2,5,1,9,10,0,4,8,7,6 };
for (lh = 0; lh < 10; ++lh)
{
rh = lh;
//将lh往后最小的数的下标变为rh
for (k = rh; k < 10; ++k)
if (array[k] < array[rh]) rh = k;
//若lh对应的值不是最小的数,则交换最小的值array[rh]与array[lh]的值
if (rh != lh)
{
tmp = array[lh];
array[lh] = array[rh];
array[rh] = tmp;
}
}
for (int x : array)//用范围for访问数组
cout << x << " ";
cout << endl;
return 0;
}
输出结果为:
冒泡排序法
通过调整违反次序的相邻元素的位置达到排序的效果。
从头到尾的比较两个相邻的元素,将小的换到前面,大的换到后面。经过从头到尾的一次调换,就把最大的元素交换到了最后一个位置,这个过程称为一趟起泡。在从头开始到倒数第二个元素进行第二次起泡。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a[] = { 1,2,5,6,8,9,7,4,3,0,10};
int i, j, tmp;
bool flag;//记录一次起泡中是否发生数据交换
for ( i = 0; i < 10; ++i)//控制十次起泡
{
flag = false;
for(j = 0; j < 10 - i; ++j)
if (a[j] > a[j + 1])//如果前面的数大于后面的则交换两者位置
{
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
flag = true;
}
if (!flag) break;//如果一次起泡中未发生数据交换,则说明已经排好顺序
}
for (int x : a)//范围for访问数组
cout << x << " ";
cout << endl;
return 0;
}
运行结果: