1.冒泡排序 时间复杂度
为O(n^2)
static void Main(string[] args)
{
Random rnd = new Random();
ArrayList List = new ArrayList();
for (var i = 0; i < 6; i++)
{
var Num = rnd.Next(0, 100);
Console.Write(Num.ToString() + ",");
List.Add(Num);
}
Console.WriteLine();
Console.WriteLine("开始进行顺序排序:");
for (var i = 0; i < List.Count; i++)
{
for (var j = 0; j < List.Count - 1; j++)
{
var a = Convert.ToInt32(List[j]);
var b = Convert.ToInt32(List[j + 1]);
if (a < b)
{
var temp = a;
List[j] = List[j + 1];
List[j + 1] = a;
}
foreach (var item in List)
{
Console.Write(item + ",");
}
Console.WriteLine();
}
}
Console.WriteLine();
//foreach (var item in List)
//{
// Console.Write(item + ",");
//}
Console.ReadLine();
}
2.选择排序 比较次数O(n^2
static void Main(string[] args)
{
Random rnd = new Random();
ArrayList List = new ArrayList();
for (var i = 0; i < 6; i++)
{
var Num = rnd.Next(0, 100);
Console.Write(Num.ToString() + ",");
List.Add(Num);
}
Console.WriteLine();
Console.WriteLine("开始进行排序:");
for (var i = 0; i < List.Count; i++)
{
for (var j = i + 1; j < List.Count; j++)
{
var a = Convert.ToInt32(List[i]);
var b = Convert.ToInt32(List[j]);
if (a < b)
{
var temp = a;
List[i] = List[j];
List[j] = a;
}
foreach (var item in List)
{
Console.Write(item + ",");
}
Console.WriteLine();
}
}
Console.WriteLine();
//foreach (var item in List)
//{
// Console.Write(item + ",");
//}
Console.ReadLine();
}
3.插入法排序 时间复杂度为O(n^2)。
public static void SortList(ArrayList List)
{
for (int i = 1; i < List.Count; i++)
{
foreach (var item in List)
{
Console.Write(item + ",");
}
Console.WriteLine();
//最后插入的位置
var Pos = i;
//最后要插入的值
var Temp = Convert.ToInt32(List[Pos]);
while (Pos > 0 && Temp < Convert.ToInt32(List[Pos - 1]))
{
Console.WriteLine("List[{0}]=List[{1}],List[{2}]={3}", Pos, Pos - 1, Pos, List[Pos - 1]);
List[Pos] = List[Pos - 1];
Pos--;
}
Console.WriteLine("List[{0}]={1}", Pos, Temp);
List[Pos] = Temp;
}
}
static void Main(string[] args)
{
Random rnd = new Random();
ArrayList List = new ArrayList();
for (var i = 0; i < 6; i++)
{
var Num = rnd.Next(0, 100);
Console.Write(Num.ToString() + ",");
List.Add(Num);
}
Console.WriteLine();
Console.WriteLine("开始进行冒泡双向排序:");
Sort.SortList(List);
foreach (var item in List)
{
Console.Write(item + ",");
}
Console.ReadLine();
}
4.折半插入 折半插入排序算法是一种稳定的排序算法,比直接插入算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为O(n^2),与直接插入排序算法相同。附加空间O(1)。
public static void SortList(ArrayList List)
{
for (int i = 1; i < List.Count; i++)
{
int temp = Convert.ToInt32(List[i]);
int low = 0;
int high = i - 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (temp < Convert.ToInt32(List[mid]))
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
for (int j = i; j >= low + 1; j--)
{
List[j] = List[j - 1];
}
List[low] = temp;
}
static void Main(string[] args)
{
Random rnd = new Random();
ArrayList List = new ArrayList();
for (var i = 0; i < 6; i++)
{
var Num = rnd.Next(0, 100);
Console.Write(Num.ToString() + ",");
List.Add(Num);
}
Console.WriteLine();
Console.WriteLine("开始进行排序:");
Sort.SortList(List);
foreach (var item in List)
{
Console.Write(item + ",");
}
Console.ReadLine();
}