public static class SortTool {
/// <summary>
/// 选择排序;
/// 原理:从排序的数据中选择最小的放在第一个,循环完继续从第二个开始找最小的,以此类推;
/// 时间复杂度:N^2; 特点:移动次数小
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static int[] SelectionSort(int[] a)
{
int min = 0;
int temp = 0;
for (int i = 0; i < a.Length-1; i++)
{
min = i;
for (int j=i+1; j < a.Length; j++)
{
if(a[j]<a[min])
{
min = j;
}
}
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
return a;
}
/// <summary>
/// 插入排序;
/// 原理:如果循环到的数据比前一个小,则与前面交换位置,一直循环到最开始的位置,以此类推;
/// 时间复杂度:N^2(平均),N(最少); 特点:如果数据倒置的数量少,速度快
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static int[] InsertSort(int[] a)
{
int temp = 0;
for (int i = 0; i < a.Length; i++)
{
for (int j = i; j >0&&a[j-1]>a[j]; j--)
{
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
return a;
}
/// <summary>
/// 冒泡排序;
/// 原理:将小得数字往上浮,(看了好几个版本都不一样,,先这么写着吧,,,等我看个书在更新下。。)
/// 时间复杂度:N^2
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static int[] BubbleSort(int[] a)
{
int temp = 0;
for (int i = 0; i < a.Length-1; i++)
{
for (int j = i+1; j < a.Length; j++)
{
if(a[j]<a[i])
{
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
return a;
}
/// <summary>
/// 希尔排序
/// 原理:把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。随着步长逐渐减小,
/// 所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static int[] ShellSrot(int[] a)
{
int gap = a.Length / 2;
while (gap>=1)
{
for (int i = gap; i < a.Length; i++)
{
int j = 0;
int temp = a[i];
for (j = i-gap; j>=0&&temp<a[j]; j = j-gap)
{
a[j + gap] = a[j];
}
a[j + gap] = temp;
}
gap /= 2;
}
return a;
}
/// <summary>
/// 快速排序
/// 原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
/// 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
/// </summary>
/// <param name="a">数组</param>
/// <param name="low">下标开始的位置,从右开始查找</param>
/// <param name="higt">下标开始的位置,从左开始查找</param>
/// <returns></returns>
public static int[] QKSort(int[] a,int low,int high)
{
if (low >= high)
return a;
int index = QKSortFun(a, low, high);
QKSort(a, low, index - 1);
QKSort(a, index + 1, high);
return null;
}
public static int QKSortFun(int[] a,int low,int high)
{
int key = a[low];
while (low<high)
{
//当high前的值一直大于key的时候high递减,当小于等于的时候赋值到a[low]
while (low < high && a[high] > key)
high--;
//比key小的放左边
a[low] = a[high];
//从low往后找大于key的值
while (low < high && a[low] <= key)
low++;
//比key小的放左边
a[high] = a[low];
}
a[low] = key;
return high;
}
}