C#排序算法-直接排序和归并排序
一级目录
一:直接插入排序
思想:
直接插入排序是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。
这个句话怎么理解呢:这句话的重点是已排好的有序表中插入一个待排序的元素;
举个例子:
int[] array = new[] {8, 10, 50, 24, 13, 86, 16, 13, 14, 9, 6, 0};
这是一个无序数组对它进行排序
1.首先我们可以把第一个元素 8 看作是一个有序的表,(即8前面的数字都比 8 要小)。
2.把8之后的都看作为待排序的元素
好下面上代码解释
2.代码
/// <summary>
/// 直接插入排序
/// </summary>
/// <param name="array"></param>
public static void StraightInsertionSort(int[] array) {
//此时我们已经将8看作是有序的序列(即8前面的数字都比8小)
//所以我们从待排的第一个元素开始遍历
for (int i = 1; i < array.Length; i++) {
int sentinel = array[i]; // 找出第一个待排元素
int j = i - 1; //此时他要跟有序序列的最后一个元素进行比较
//如果 j > 0 并且待排元素比有序的最后一个元素要小 则将有序元素进行后移一位 再此跟倒数第二未元素进行比较,直到找到比到比待排元素小的停止
while (j >= 0 && sentinel < array[j]) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = sentinel;
}
}
一:归并排序
推荐视频:归并排序视频讲解
首先看定义:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
个人理解:1.首先由上面的直接插排序中我们可以把一个数字看成有序的序列。那么归并中第一步就是将无序序列分成两个序列;然后进行递归直至分到每个序列都是有序的(即每个数都看作一个序列)然后进行归并。
2.举例说明 例如
int[] array = new[] {5, 3, 4, 2};
可以分为【5,3】和【4,2】其中递归【5,3】又可以分为【5】和【3】此时都为有序序列
然后进行合:思想是对比有序序列末尾项谁小谁就填入到新数列中 【3,5】由此可知另一个为【2,4】然后再次进行合并为【2,3,4,5】
代码
/// <summary>
/// 归并排序
/// </summary>
/// <param name="array">数组</param>
/// <param name="low">数组起始下标</param>
/// <param name="high">数组末尾下标</param>
public static void MergeSort(int [] array ,int low,int high)
{
//即分无可分
if (low<high)
{
//分割线即取中间值
int mid = (high + low) / 2;
//递归
MergeSort(array, low, mid);
//递归
MergeSort(array,mid+1, high);
//合并
Merge(array, low, mid, high);
}
}
/// <summary>
/// 归并两个有序数组
/// </summary>
/// <param name="array">原来数组</param>
/// <param name="low">数组开始下标</param>
/// <param name="mid">切割中间值-分割为两个数组</param>
/// <param name="high">数组的结尾下标</param>
public static void Merge(int[] array, int low, int mid, int high)
{
//新排列的列表
int [] mergeArr = new int[high-low + 1];
//第一个数组开始下标
int left = low;
//第二个数组的开始下标值
int right = mid + 1;
int merge = 0; //新数组的移动下标
while (left <= mid && right <=high)
{
if (array[left] < array [right])
{
mergeArr[merge++] = array[left++];
}
else
{
mergeArr[merge++] = array[right++];
}
}
//将剩下的填入数组中
while (left<=mid)
{
mergeArr[merge++] = array[left++];
}
while (right <=high)
{
mergeArr[merge++] = array[right++];
}
merge = 0;
//赋值数组
while (low <=high)
{
array[low++] = mergeArr[merge++];
}
}
推荐学习算法的网站:算法学习-里面有演示
说明:本文章的代码原版为.Net中文网
最后:能力有限如果有解释不清楚的地方望原谅。