冒泡排序的多种写法、逻辑
Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) |
1
Bubble Sort —— 上推分类法
本方法重点在于根据次第来完成运算
1 —— 把最小数移动到最后一位
2 —— 由于最后一位确定,所以在第二次运算时不用计算。所以第二次计算次数 减 1
3 —— 依次类推,就可用简单的for循环来达到排序的目的
4 —— 具体由大到小,还是由小到大。根据自己的需要调节 ” > < ” 的比较方式,交换顺序不需要变化。
数组中:a[0]与a[1] 位置交换的方式,不使用中间变量的情况下 ↓
a[j] = a[j] + a[j + 1]; //a[0]=10+120
a[j + 1] = a[j] - a[j + 1]; //a[1]=130-120 —— (10)
a[j] = a[j] - a[j + 1]; //a[0]=130-10 —— (120)
using System;
namespace TestMaoPao
{
/// <summary>
/// 测试脚本 —— 冒泡排序
/// </summary>
class BubbleSort
{
/// <summary>
/// 主入口
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
int[] list = { 10, 8, 3, 5, 6, 7, 9, 0, 1, 2 };//声明一个数组
int count = 0;//记录运算次数
count = Sort(list);//Sort函数的返回值,赋值给count
Console.WriteLine(count);//输出count,说明计算多少次
Console.WriteLine("**********************");//这是一条区分线,仅为了醒目
for (int i = 0; i < list.Length; i++)//遍历输出(整理后)数组
{
Console.WriteLine(list[i]);//根据下标,打印每个值
}
Console.ReadKey();//等待用户输入,任意键 (默认运行完,关闭控制台)
}
/// <summary>
/// 计算方式 —— 根据次第运算
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
private static int Sort(int[] a)
{
int count = 0;//记录运算次数的变量
for (int i = a.Length - 1; i > 0; i--)//控制次第比较的个数,首次为与9个数进行比较
{
for (int j = 0; j < i; j++)//
{
count++; //次数自增
if (a[j] < a[j + 1])//第一数 < 第二个数
{
//这里使用了不加临时变量,进行数值交换 (当然加个临时变量也是一样的)
a[j] = a[j] + a[j + 1]; //a[0]=10+120
a[j + 1] = a[j] - a[j + 1]; //a[1]=130-120 —— (10)
a[j] = a[j] - a[j + 1]; //a[0]=130-10 —— (120)
//从而 a[0] 与 a[1] 交换位置
//第一次 交换下来,最小值会在最后一个
//由于最后一个值已经确定最小。所以外部循环次数减 1 ,第二次只需要比较8个数
}
}
}
return count;//Sort函数的返回值 —— 记录运算次数
}
}
}
最后输出结果为:
45 (运算次数)
**********************
10
9
8
7
6
5
3
2
1
0
2
Bubble Sort —— 冒泡排序( - 根据下标)
本方法重点在于根据下标来完成运算
1 —— 把最小数移动到第一位
2 —— 由于第一位最小值确定,所以在第二次运算时不用计算。所以第二次计算时,从下标 list[1](也就是第二个数)开始做对比
3 —— 依次类推,就可用简单的for循环来达到排序的目的
4 —— 具体由大到小,还是由小到大。根据自己的需要调节 ” > < ” 的比较方式,交换顺序不需要变化。
数组中:a[0]与a[1] 位置交换的方式,使用中间变量的情况下 ↓
int tempNumber = a[j]; ; //tempNumber = 8
a[j] = a[i]; //a[1]=10
a[i] = tempNumber; //a[0]=8
using System;
namespace TestMaoPao
{
/// <summary>
/// 测试脚本 —— 冒泡排序
/// </summary>
class BubbleSort
{
/// <summary>
/// 主入口
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
int[] list = { 10, 8, 3, 5, 6, 7, 9, 0, 1, 2 };//声明一个数组
int count = 0;//记录运算次数
count = Sort(list);//Sort函数的返回值,赋值给count
Console.WriteLine(count);//输出count,说明计算多少次
Console.WriteLine("**********************");//这是一条区分线,仅为了醒目
for (int i = 0; i < list.Length; i++)//遍历输出(整理后)数组
{
Console.WriteLine(list[i]);//根据下标,打印每个值
}
Console.ReadKey();//等待用户输入,任意键 (默认运行完,关闭控制台)
}
/// <summary>
/// 计算方式 —— 根据下标排序
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
private static int Sort(int[] a)
{
int count = 0;//记录运算次数的变量
for (int i = 0; i < a.Length; i++)//外部for循环:遍历数组长度个数的下标,首次为0
{
for (int j = i + 1; j < a.Length; j++)//内部for循环:遍历数组个数的下标,首次为1
{
count++;//次数自增
if (a[j] < a[i]) //第二数 < 第一个数
{
//把第二个数的值赋值给临时变量
int tempNumber = a[j]; ; //tempNumber = 8
a[j] = a[i]; //a[1]=10
a[i] = tempNumber; //a[0]=8
//从而 a[0] 与 a[1] 交换位置
//第一次 交换下来,最小值会在第一个
//由于第一个值已经确定最小。
//所以外部循环第二次运行时是从第二个数( a[1] )开始的
//第二次内部循环是从 ( a[2] )只需要比较8个数
}
}
}
return count;//Sort函数的返回值 —— 记录运算次数
}
}
}
最后输出结果为:
45 (运算次数)
**********************
0
1
2
3
5
6
7
8
9
10
3
Bubble Sort —— 冒泡排序( - 根据轮数)
本方法重点在于根据次第来完成运算
1 —— 把最小数移动到第一位
2 —— 由于第一位最小值确定,所以在第二次运算时不用计算。所以第二次计算时,从下标 list[1](也就是第二个数)开始做对比
3 —— 依次类推,就可用简单的for循环来达到排序的目的
4 —— 具体由大到小,还是由小到大。根据自己的需要调节 ” > < ” 的比较方式,交换顺序不需要变化。
最后输出结果为:
45 (运算次数)
**********************
0
1
2
3
5
6
7
8
9
10
4
Bubble Sort —— do while ( - 判定是否满足有序)
本方法重点在于:判定满足依次排列,有序后跳出循环
数组中:a[0]与a[1] 位置交换的方式,不使用中间变量的情况下 ↓
a[j] = a[j] + a[j + 1]; //a[0]=10+120
a[j + 1] = a[j] - a[j + 1]; //a[1]=130-120 —— (10)
a[j] = a[j] - a[j + 1]; //a[0]=130-10 —— (120)
using System;
namespace TestMaoPao
{
/// <summary>
/// 测试脚本 —— 冒泡排序
/// </summary>
class BubbleSort
{
/// <summary>
/// 主入口
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
int[] ints = {5, 4, 3, 8, 9, 1, 7, 2, 0, 6, 10};
Short(ints);
foreach (var i in ints)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
/// <summary>
/// 冒泡排序
/// </summary>
/// <param name="ints"></param>
static void Short(int[] ints)
{
int count = 0;
bool isStop; //声明布尔为 true
do
{
isStop = false; //此标志位,为结束循环
for (int i = 0; i < ints.Length - 1; i++) //遍历数组
{
if (ints[i] > ints[i + 1])
{
ints[i + 1] = ints[i] + ints[i + 1];
ints[i] = ints[i + 1] - ints[i];
ints[i + 1] = ints[i + 1] - ints[i];
isStop = true; //标志位:false
count++;
}
}
} while (isStop);
Console.WriteLine("循环次数: " + count);
}
}
}
最后输出结果为:
循环次数: 27
0
1
2
3
4
5
6
7
8
9
10
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址