//
//作者:陈继民
//把一些自己实现的算法记录一下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lib
{
public class Sort
{
/// <summary>
/// 插入递增排序
/// </summary>
/// <param name="unsortarray">排序前数组</param>
/// <returns>排序后数组</returns>
public int[] Insert(int[] unsortarray)
{
int[] insertResult = new int[unsortarray.Length];
insertResult[0] = unsortarray[0];
for (int i = 1; i < insertResult.Length; i++)
{
int key = unsortarray[i];
int j = i - 1;
while (j >= 0 && insertResult[j] > unsortarray[i])
{
insertResult[j + 1] = insertResult[j];
j = j - 1;
}
insertResult[j + 1] = key;
}
return insertResult;
}
/// <summary>
/// 选择递增排序
/// </summary>
/// <param name="sortarray">排序前数组</param>
/// <returns>排序后数组</returns>
public int[] Selection(int[] sortarray)
{
int loopLimits = 0;
int temp;
while (loopLimits < sortarray.Length)
{
for (int i = loopLimits + 1; i < sortarray.Length; i++)
{
if (sortarray[i] < sortarray[loopLimits])
{
temp = sortarray[loopLimits];
sortarray[loopLimits] = sortarray[i];
sortarray[i] = temp;
}
}
loopLimits++;
}
return sortarray;
}
/// <summary>
/// 冒泡递增排序
/// </summary>
/// <param name="sortarray">排序前数组</param>
/// <returns>排序后数组</returns>
public int[] Bubble(int[] sortarray)
{
for (int i = 0; i < sortarray.Length; i++)//每轮比较后增1,减少后面比较的个数
{
for (int j = 0; j < sortarray.Length - 1 - i; j++) //每次比较相邻两个数字,较大者排后
{
if (sortarray[j] > sortarray[j + 1])
{
int temp = sortarray[j];
sortarray[j] = sortarray[j + 1];
sortarray[j + 1] = temp;
}
}
}
return sortarray;
}
/// <summary>
/// 快速递增排序
/// </summary>
/// <param name="array">排序前数组</param>
/// <param name="p">数组头</param>
/// <param name="r">数组尾</param>
/// <returns></returns>
public int[] Quick(int[] array, int p, int r)
{
if (p < r)
{
int q = Partition(array, p, r);
Quick(array, p, q - 1);
Quick(array, q + 1, r);
}
return array;
}
/// <summary>
/// 快速排序辅助函数
/// </summary>
/// <param name="array">数组</param>
/// <param name="p">数组头</param>
/// <param name="r">数组尾</param>
/// <returns></returns>
public int Partition(int[] array, int p, int r)
{
int x = array[r];
int i = p - 1;
int temp = 0;
for (int j = p; j < r; j++)
{
if (array[j] < x)
{
i++;
temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
temp = array[i + 1];
array[i + 1] = array[r];
array[r] = temp;
return i + 1;
}
/// <summary>
/// 计数递增排序,适用于
/// </summary>
/// <param name="array">排序前数组</param>
/// <returns>排序后数组</returns>
public int[] Counting(int[] array)
{
int maxvalue = array[0];
//最多n-1次遍历找到最大值
for (int i = 1; i < array.Length; i++)
{
if (array[i] > maxvalue)
{
maxvalue = array[i];
}
}
//声明一个长度为最大值+1的数组
int[] newarray = new int[maxvalue+1];
//遍历该新数组,赋值为0
for (int i = 0; i < newarray.Length; i++)
{
newarray[i] = 0;
}
//遍历排序前数组,计算每一个值出现的次数,存入暂存数组中
for (int i = 0; i < array.Length; i++)
{
newarray[array[i]]++;
}
//遍历暂存数组,计算每一个元素前最多有几个元素,方便后面排序时知道数据的正确位置
for (int i = 1; i < newarray.Length; i++)
{
newarray[i] = newarray[i] + newarray[i - 1];
}
//声明一个长度与排序数组长度一样的数组,用来存放排序后的数组
int[] resultarray = new int[array.Length];
//遍历数组,进行安放数据,同时每次将暂存数组对应的值自减一
for (int i = 0; i < resultarray.Length; i++)
{
resultarray[newarray[array[i]]-1] = array[i];
newarray[array[i]]--;
}
return resultarray;
}
}
}
【排序算法】C#实现排序算法
猜你喜欢
转载自blog.csdn.net/DGPLM/article/details/51017114
今日推荐
周排行