冒泡排序实际上是一种交换排序,它的核心思想就是对相邻的记录两两比较,逆序交换,直到没有逆序 。
简单插入排序算法主要思想是每次在剩余子序列中找到最小值并放到该子序列的第一个位置。
#include<iostream>
using namespace std;
void swap(int* a, int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void SelectSort(int* a, int length)// 简单选择排序,每次在剩余序列中找到最小值跟第一个位置交换
{
int i, j;
for(i = 0; i < length - 1; i++)//外循环控制趟数,一共进行 n-1趟,因为第n趟就剩一个元素且已经是最大值,所以没必要了
{
int min = i;//假设第i个值为最小值,min存的一直是最小值的下标
for(j = i + 1; j < length; j++)//j从i的后一个位置开始直到最后结束
{
if(a[j] < a[min])//如果发现第j个位置上的值比第min 个位置上的值小,就让min = j,min始终存最小值的下标
{
min = j;
}
}
if(i != min)//如果min和i不相等,就要交换,否则不用交换
{
swap(a[i], a[min]);
}
}
}
void BubbleSort(int* a, int length)// 冒泡排序 1 从前往后 ,每一趟把一个最大值冒到上面
{
bool flag = true;//优化操作
for(int i = 0; i < length - 1&&flag; i++)//控制趟数 n-1趟
{
flag = false;// 先将flag变为false
for(int j = 0; j < length - 1 - i; j++)// 注意j的判定条件,可以根据自己的想法调整,不是固定的
{//当你不知道j的判定条件是怎样的时候,可以拿一个特例验证一下,比如当i= 0 时,我们只需要j到达
// 倒数第二个值,因为每次都是和后面的比较,所以j最大为 length - 2 - i(=0) 即 < length - 1 - i;
if(a[j] > a[j+1])
{
swap(a[j],a[j+1]);
flag = true;//有交换操作则赋值为true,如果这一趟都没有进行过交换,就说明已经有序,下一趟就不进行了
}
}
}
}
void BubbleSort2(int* a, int length) // 冒泡排序2 从后往前
{
bool flag = true;
for(int i = 0; i < length - 1&&flag; i++)// 控制趟数
{
flag = false;
for(int j = length - 1; j > i; j--)// j从最后一个记录向前比较
{
if(a[j] < a[j-1])//如果它比前面的值小,就交换位置
{
swap(a[j],a[j-1]);
flag = true;
}
}
}
}
int main()
{
//验证算法,在此测试项中都可以通过
int a[] = {9,8,7,6,5,4,3,2,1};
BubbleSort2(a, 9);
for(int i = 0; i < 9; i++)
{
cout<<a[i]<<" ";
}
cout<< endl;
return 0;
}