C#算法之排序算法

1.直接插入排序

        遍历数组。从索引1处开始为i,拿i处成员和其前面索引成员进行比较。
        如果其比i处成员大,和i处成员交换位置。如果比i处成员小,停止比较。

//直接插入排序
static void InsertSort(int[] dataArray)
{
	//从数组索引1处开始遍历
	for (int i = 1; i < dataArray.Length; i++)
	{
		bool isInsert = false;
		int iValue = dataArray[i];
		//i处的元素和其前面所有的元素比较
		for (int j = i - 1; j >= 0; j--)
		{
			//如果比i大,使其向后移动
			if (dataArray[j] > iValue)
			{
				dataArray[j + 1] = dataArray[j];
			}
			//如果遇到比i小的,停止移动,跳出循环
			else
			{
				dataArray[j + 1] = iValue;
				isInsert = true;
				break;
			}
		}
		if (isInsert == false)
		{
			dataArray[0] = iValue;
		}
	}
}

2.简单选择排序

        从索引0处为i开始遍历数组,0处成员为默认的最小值,遍历i处后面的数组成员,和i处成员进行比较。
        得出最小的后和i处成员交换值。

//简单选择排序
static void SelectSort(int[] dataArray)
{
	//从索引0开始遍历数组成员
	for(int i = 0; i < dataArray.Length-1; i++)
	{
		//设当前成员为最小值,记录当前成员的索引
		int min = dataArray[i];
		int minIndex = i;
		//从当前成员后开始遍历剩余成员
		for (int j=i+1;j<dataArray.Length;j++)
		{
			//得到最小的成员及其索引
			if (dataArray[j] < min)
			{
				min = dataArray[j];
				minIndex = j;
			}
		}
		//如果最小成员的索引不是当前成员的索引,则需要交换位置
		if (minIndex != i)
		{
			int temp = dataArray[i];
			dataArray[i] = dataArray[minIndex];
			dataArray[minIndex] = temp;
		}
	}
}

3.快速排序(分治法)

        初始化基准值为左索引,i为左索引,j为右索引。
        j处成员小于x的话就将j处成员赋值到i处,否则j索引累减。左移后进行右移。
        i处成员大于x的话就将i处成员赋值到j处,否则i索引累加。重复以上两次操作直到i==j。
        i==j后即i左侧全为小于i处索引成员的,右侧为大于的。基准值即为i处索引成员。
        对基准值两侧数据再进行分治,直到全部按大小排序完成

/// 快速排序
/// </summary>
/// <param name="dataArray">排序的数组</param>
/// <param name="left"><数组排序的开始索引/param>
/// <param name="right">数组排序的结束索引</param>
static void QuickSort(int[] dataArray,int left,int right)
{
	if (left < right)
	{
		//基准数,将数组成员比其小的放在其左,比其大的放在其右
		int x = dataArray[left];
		int i = left, j = right;
		//当i==j时,即找到了中间位置
		while (true&&i<j)
		{
			//从后往前比较,得到比x小的数字,和i位置的数据交换
			while (true && i < j)
			{
				//如果找到了比基准数小的成员,将其放在i的位置
				if (dataArray[j] <= x)
				{
					dataArray[i] = dataArray[j];
					break;
				}
				else
				{
					j--;//向左移动,继续比较,直到右索引j小于等于左索引i
				}
			}
			//从前往后比较,得到比x大的数字,和i位置的数据交换
			while (true && i < j)
			{
				if (dataArray[i] > x)
				{
					dataArray[j] = dataArray[i];
					break;
				}
				else
				{
					i++;
				}
			}
		}
		//跳出循环,i==j,为中间位置的索引,将基准值放在中间位置
		dataArray[i] = x;
		//对中间位置两边,即left-i和i-right索引间的数据循环排序
		QuickSort(dataArray, left, i - 1);
		QuickSort(dataArray, i + 1, right);
	}
}

猜你喜欢

转载自blog.csdn.net/u012187817/article/details/80710596