参考自《大话数据结构》
这是给我自己看的,看不懂可以问我hhhh
首先公用方法如下:
- 交换两个数的方法Swap():
static void Swap(List<int> L, int i, int j)
{
int temp = L[i];
L[i] = L[j];
L[j] = temp;
}
- 打乱List内容的方法:
static void randsort(List<int> A)
{
Random random = new Random();
int index = 0;
int temp = 0;
for (int i = 0; i < A.Count; i++)
{
index = random.Next(0, A.Count - 1);
if (index != i)
{
temp = A[i];
A[i] = A[index];
A[index] = temp;
}
}
}
- 测试代码:
static void Main(string[] args)
{
int nums = 10;//list的长度
#region
List<int> list = new List<int>();
for (int i = 0; i < nums; i++)
{
list.Add(i);
}
Console.WriteLine("打乱之前: ");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine("List[" + i + "] is " + list[i]);
}
Console.WriteLine("----------------");
randsort(list);
Console.WriteLine("打乱顺序之后:");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine("List[" + i + "] is " + list[i]);
}
Console.WriteLine("----------------");
#endregion
//BubbleSort(list);
//SelectSort(list);
//InsertSort(list);
//ShellSort(list);
//HeadSort(list);
#region//输出
Console.WriteLine("排序之后: ");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine("List[" + i + "] is " + list[i]);
}
#endregion
}
- 展示代码输出结果如下,后面我截图就省略打乱之后的效果了:
1. 冒泡排序:
-
逻辑:设置两个索引 i 和 j ,i 从前面第一个位置开始遍历,每一次遍历都会 让 j从后往前遍历(j从倒数第二个开始遍历,依次比较 j 和 j+1),设置一个flag作为标志,如果某一次 i 遍历之后并没有进行 j 循环里面的,那么顺序已经排好序了。
-
代码如下:
static void BubbleSort(List<int> L)
{
int i, j;
bool flag = true;
Console.WriteLine("enter");
for (i = 0; i < L.Count && flag; i++)
{
flag = false;
for (j = L.Count - 2; j >= i; j--)
{
if (L[j] > L[j + 1])
{
Swap(L, j, j + 1);
flag = true;
}
}
}
}
测试结果:
2. 简单选择排序:
-
逻辑:不说了打字好累
-
代码如下:
static void SelectSort(List<int> L)
{
int i, j, min;
for (i = 0; i < L.Count - 1; i++)
{
min = i;
for (j = i + 1; j < L.Count; j++)
{
if (L[j] < L[min])
{
min = j;
}
}
if (min != i)
{
Swap(L, min, i);
}
}
}
测试结果:
3. 直接插入排序
- 逻辑:省略,注意下面的注释,我一直以为for里面的第二个判断是跟逻辑无关的,直到我那天整这个整了3个小时…
- 代码如下:
static void InsertSort(List<int> L)
{
int i, j;
for (i = 1; i < L.Count; i++)
{
//int temp;
if (L[i] < L[i - 1])
{
int temp = L[i];
//跟顺序有关系j >= 0 和 L[j] > temp换过来会报错:超出索引
for (j = i - 1; j >= 0 && L[j] > temp; j--)
{
L[j + 1] = L[j];
}
L[j + 1] = temp;
}
}
}
- 效果截图:
4. 希尔shell排序
-
逻辑:省略
-
代码如下:
static void ShellSort(List<int> L)
{
int i, j, temp;
int increment = L.Count;
do
{
increment = increment/3+1;
//书上是i=increment+1,如果加1的话那么是L[1]跟L[1+increment]替换,L[0]没有进行替换
for (i = increment ; i < L.Count; i++)
{
if (L[i] < L[i - increment])
{
temp = L[i];
for (j = i - increment; j >= 0 && L[j] > temp; j-=increment)
{
L[j + increment] = L[j];
}
L[j + increment] = temp;
}
}
} while (increment > 1);
}
- 效果截图:
后面的写完了再整
5. 排序
-
逻辑:省略
-
代码如下:
-
效果截图:
6. 排序
-
逻辑:省略
-
代码如下:
-
效果截图:
7. 排序
-
逻辑:省略
-
代码如下:
-
效果截图:
来源:CSDN
作者:Awei_orz
链接:https://blog.csdn.net/weixin_40204921/article/details/104630663