using System;
namespace lesson13_冒泡排序
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("冒泡排序");
#region 排序的基本概念
//排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列
//常用的排序例子
//8 7 1 5 4 2 6 3 9
//把上面的这个无序序列 变为 有序(升序或降序)序列的过程
//1 2 3 4 5 6 7 8 9(升序)
//9 8 7 6 5 4 3 2 1(降序)
//在程序中 序列一般 存储在数组当中
//所有 排序往往是对 数组进行排序
int[] arr = new int[] { 8, 7, 1, 5, 4, 2, 6, 3, 9 };
//把数组里面的内容变为有序的
#endregion
#region 冒泡排序基本原理
//8 7 1 5 4 2 6 3 9
//两两相邻
//不停比较
//不停交换
//比较n轮
#endregion
#region 代码实现
/*for (int j = 0; j < arr.Length; j++)
{
for (int i = 0; i < arr.Length-1; i++)
{
if (arr[i] > arr[i + 1])
{
int x = 0;
x = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = x;
}
}
}
for (int i = 0; i < arr.Length; i++)
{
Console.Write(" " + arr[i]);
}*/
//优化
//1.确定位置的数字不用比较了
//确定一轮后 极值(最大或最小)已经放到了对应的位置(往后放)
//所以 每完成n轮 后面位置的数 就不用再参与比较了
/*for (int j = 0; j < arr.Length; j++)
{
for (int i = 0; i < arr.Length-1-j; i++)
{
if (arr[i] > arr[i + 1])
{
int x = 0;
x = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = x;
}
}
}
for (int i = 0; i < arr.Length; i++)
{
Console.Write(" " + arr[i]);
}*/
//特殊情况下的优化
//外面申明一个标识 来表示 该轮是否进行了交换
bool isSort = false;
for (int j = 0; j < arr.Length; j++)
{
//每一轮开始时 默认没有进行过交换
isSort = false;
for (int i = 0; i < arr.Length - 1; i++)
{
if (arr[i] > arr[i + 1])
{
isSort = true;
int x = 0;
x = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = x;
}
}
//当一轮结束过后 如果isSort 这个标识 还是false
//那就意味着 已经是最终的序列了 不需要再判断交换了
if (!isSort)
{
break;
}
}
for (int i = 0; i < arr.Length; i++)
{
Console.Write(" " + arr[i]);
}
#endregion
}
}
}