一、基础排序算法
(一)冒泡排序
冒泡排序是可用的最慢的排序算法之一,但是它也是最容易理解和实现的一种排序算法。这种排序的得名是由与数值“像气泡一样”从序列的一端浮动到另外一端。假设现在要把一列数按升序的方式进行排序,将较大的数值浮动到右侧,而小的浮动到左侧。这种效果可以通过冒泡排序来实现,具体代码如下:
首先新建一个c#控制台程序,添加一个CArray类,该类用来产生一个整型数组。代码如下:
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class CArray
{
private int[] arr;//int 数组
private int upper;//数组上线
private int numElements;//数组下标
/// <summary>
/// 构造函数
/// </summary>
/// <param name="size">数组大小</param>
public CArray(int size)
{
arr = new int[size];
upper = size - 1;
numElements = 0;
}
/// <summary>
/// 插入一个数到数组
/// </summary>
/// <param name="item"></param>
public void Insert(int item)
{
arr[numElements] = item;
numElements++;
}
/// <summary>
/// 显示数组
/// </summary>
public void DisplayElement()
{
for (int i = 0; i <= upper; i++)
{
Console.Write(arr[i]+" ");
}
}
/// <summary>
/// 清空数组
/// </summary>
public void Clear()
{
for (int i = 0; i <= upper;i++ )
{
arr[i] = 0;
numElements = 0;
}
}
/// <summary>
/// 返回数组
/// </summary>
/// <returns></returns>
public int[] ReturnArr()
{
return arr;
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class CArray
{
private int[] arr;//int 数组
private int upper;//数组上线
private int numElements;//数组下标
/// <summary>
/// 构造函数
/// </summary>
/// <param name="size">数组大小</param>
public CArray(int size)
{
arr = new int[size];
upper = size - 1;
numElements = 0;
}
/// <summary>
/// 插入一个数到数组
/// </summary>
/// <param name="item"></param>
public void Insert(int item)
{
arr[numElements] = item;
numElements++;
}
/// <summary>
/// 显示数组
/// </summary>
public void DisplayElement()
{
for (int i = 0; i <= upper; i++)
{
Console.Write(arr[i]+" ");
}
}
/// <summary>
/// 清空数组
/// </summary>
public void Clear()
{
for (int i = 0; i <= upper;i++ )
{
arr[i] = 0;
numElements = 0;
}
}
/// <summary>
/// 返回数组
/// </summary>
/// <returns></returns>
public int[] ReturnArr()
{
return arr;
}
}
}
在Program类中添加一个冒泡程序方法代码如下:
/// <summary>
/// 冒泡排序
/// </summary>
public static void BubbleSort(int[] arr)
{
int temp;
//假设总共有n个数字,最外层是总共要比较outer=n-1遍
for (int outer = arr.GetUpperBound(0); outer >= 1; outer--)
{
//每遍要比较outer-1次。因为每次都会有最大的浮动到最右边。他们就不用比较了
for (int inner = 0; inner <= outer-1; inner++)
{
//比较相邻的两个值大小,将大的给后一个,其中交换数据用到中间变量temp
if (arr[inner] > arr[inner + 1])
{
temp = arr[inner];
arr[inner] = arr[inner + 1];
arr[inner + 1] = temp;
}
}
Console.Write("第{0}遍",arr.GetUpperBound(0)-outer+1);
foreach (var item in arr)
{
Console.Write(item + " ");//打印结果
}
Console.WriteLine();
}
}
/// 冒泡排序
/// </summary>
public static void BubbleSort(int[] arr)
{
int temp;
//假设总共有n个数字,最外层是总共要比较outer=n-1遍
for (int outer = arr.GetUpperBound(0); outer >= 1; outer--)
{
//每遍要比较outer-1次。因为每次都会有最大的浮动到最右边。他们就不用比较了
for (int inner = 0; inner <= outer-1; inner++)
{
//比较相邻的两个值大小,将大的给后一个,其中交换数据用到中间变量temp
if (arr[inner] > arr[inner + 1])
{
temp = arr[inner];
arr[inner] = arr[inner + 1];
arr[inner + 1] = temp;
}
}
Console.Write("第{0}遍",arr.GetUpperBound(0)-outer+1);
foreach (var item in arr)
{
Console.Write(item + " ");//打印结果
}
Console.WriteLine();
}
}
Main方法中产生一个10位随机数,并且调用冒泡排序方法。代码如下:
static void Main(string[] args)
{
CArray nums = new CArray(10);
Random rnd = new Random();
for (int i = 0; i < 10;i++ )
{
nums.Insert(rnd.Next(0,100));
}
Console.WriteLine("随机产生的数据如下");
nums.DisplayElement();//显示数据
Console.WriteLine();
Console.WriteLine("冒泡排序开始");
BubbleSort(nums.ReturnArr());//冒泡排序
Console.WriteLine("冒泡排序结束");
Console.ReadKey();
}
{
CArray nums = new CArray(10);
Random rnd = new Random();
for (int i = 0; i < 10;i++ )
{
nums.Insert(rnd.Next(0,100));
}
Console.WriteLine("随机产生的数据如下");
nums.DisplayElement();//显示数据
Console.WriteLine();
Console.WriteLine("冒泡排序开始");
BubbleSort(nums.ReturnArr());//冒泡排序
Console.WriteLine("冒泡排序结束");
Console.ReadKey();
}
运行 效果如下:
(二)选择排序
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。代码如下:
/// <summary>
/// 选择排序
/// </summary>
/// <param name="arr"></param>
public static void SelectionSort(int[] arr)
{
int min, temp;
for (int outer = 0; outer <= arr.GetUpperBound(0); outer++)
{
min = outer;
for (int inner = outer + 1; inner <= arr.GetUpperBound(0);inner++ )
{
if (arr[inner] < arr[min])
{
min = inner;
}
}
temp = arr[outer];
arr[outer] = arr[min];
arr[min] = temp;
Console.Write("第{0}遍", outer+1);
foreach (var item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
}
/// 选择排序
/// </summary>
/// <param name="arr"></param>
public static void SelectionSort(int[] arr)
{
int min, temp;
for (int outer = 0; outer <= arr.GetUpperBound(0); outer++)
{
min = outer;
for (int inner = outer + 1; inner <= arr.GetUpperBound(0);inner++ )
{
if (arr[inner] < arr[min])
{
min = inner;
}
}
temp = arr[outer];
arr[outer] = arr[min];
arr[min] = temp;
Console.Write("第{0}遍", outer+1);
foreach (var item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
}
效果图:
(三)插入排序
插入排序算法有两层循环,外层循环会逐个遍历数组,而内循环则把外层循环所选择的元素与该元素在数组内的下一个选素进行比较,如果外层循环选择的元素小于内层循环的元素。那么数组元素都向右移以便为内层循环元素留出位置。代码:
/// <summary>
/// 插入排序
/// </summary>
/// <param name="arr"></param>
public static void InsertIonSort(int[] arr)
{
int inner, temp;
for (int outer = 1; outer <= arr.GetUpperBound(0); outer++)
{
temp = arr[outer];
inner = outer;
while (inner > 0 && arr[inner - 1] >= temp)
{
arr[inner] = arr[inner - 1];
inner -= 1;
}
arr[inner] = temp;
Console.WriteLine("第{0}遍", outer);
foreach (var item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
}
/// 插入排序
/// </summary>
/// <param name="arr"></param>
public static void InsertIonSort(int[] arr)
{
int inner, temp;
for (int outer = 1; outer <= arr.GetUpperBound(0); outer++)
{
temp = arr[outer];
inner = outer;
while (inner > 0 && arr[inner - 1] >= temp)
{
arr[inner] = arr[inner - 1];
inner -= 1;
}
arr[inner] = temp;
Console.WriteLine("第{0}遍", outer);
foreach (var item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
}
效果图:


浙公网安备 33010602011771号