选择排序
思想: 在一个数组中,找到最小的数放在最前面,然后再在剩下的数中找到最小的放到第二位....以此类推
代码实现:
#include<iostream>
using namespace std;
void swap(int& x, int& y)//交换函数
{
int temp = 0; temp = x; x = y; y = temp;
}
void print(int* a, int len,int i)//输出函数
{
cout << "第" << i + 1 << "趟:";
for (int i = 0; i < len; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void SelectSort(int* a, int len)//选择排序
{
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)//如果a[i]>a[j]则交换其值,一轮循环后a[i]已经是最小值
{
if (a[j]<a[i])
{
swap(a[j], a[i]);
}
}
print(a, len, i);
}
}
int main()
{
int a[10] = { 16,22,3,96,45,26,107,99,1,10 };
int len = sizeof(a) / sizeof(a[0]);//求数组的长度
SelectSort(a,len);
return 0;
}
运行结果:
:
二元选择排序
思想:在每层循环时找到最小值放在最前面,最大值放在最后面,去掉这两个数继续此步骤直至结束
代码实现:
void BinarySelectSort1(int* a, int len)//二元选择排序
{
int x = len;//因为len的值会改变,所以定义x来表示长度,方便print
for (int i = 0; i < len; i++, len--)//每层循环后去掉最大最小继续比较,因为每次循环len--,实际循环次数<=n/2
{
for (int j = i + 1; j < len; j++)//从a[i+1]到a[len-1]与a[i]比较,找到最小值置前
{
if (a[j] < a[i])
swap(a[j], a[i]);
}
for (int k = len - 2; k > i; k--)//从a[len-2]到a[i+1]与a[len-1]比较,找到最大值置后
{
if (a[k] > a[len - 1])
swap(a[k], a[len - 1]);
}
print(a, x,i);
}
}
运行结果:
改进:用max和min来标记最大值和最小值的下标,直到遍历结束后找到当前遍历区域的最大值与最小值的下标然后再进行交换
代码实现:
void BinarySelectSort(int* a, int len)
{
int x = len;
int max, min;
for (int i = 0; i < len; i++, len--)//每层循环后去掉最大最小继续比较
{
int min = i;
int max = len - 1;
for(int j = i+1; j < len-1; j++)
{
if (a[j] < a[min])
min = j;
if (a[j] > a[max])
max = j;
}
swap(a[min], a[i]);
swap(a[max], a[len - 1]);
print(a, x, i);
}
}
运行结果: