C#几个基本排序

12 篇文章 0 订阅
2 篇文章 0 订阅
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;
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值