插入排序
把数组分为两个序列 一个是有序的一个是无序的 拿无序的和有序中的比较,如果所选元素比无序的小整体后移,注意最后的索引
static void InsertSort(int []arry)
{
for(int i=1;i<arry.Length;i++)
{
int temp = arry[i];
if (arry[i] < arry[i - 1])
{
int j;
for(j=i-1;j>=0&&arry[j]>temp;j--)
{
arry[j + 1] = arry[j];
}
arry[j+1] = temp; // 注意索引
}
}
}
选择排序
选出数组中最小的元素看看是不是在a[0]的位置,如果不是两个元素对调,然后选择数组中第二小的元素,看看他的位置是不是在a[1],不是的话对调…
static void SelectOnSrot(int []arry)
{
for(int i=0;i<arry.Length;i++)
{
int min = i;
for (int j=i+1; j < arry.Length; j++)
{
if(arry[j]<arry[min])
{
min = j;
}
}
if(min==i)
{
continue;
}
else
{
int temp = arry[i];
arry[i] = arry[min];
arry[min] = temp;
}
}
}
快速排序
在数组中选出一个基值通常是a[0],然后比他小的放他左边比他大的放他右边,然后通过递归继续划分,直至排出顺序。
static void QuickSort(int[] arry,int left,int right)
{
if(left<right)
{
int x = arry[left];
int i = left;
int j = right;
while (true && i < j)
{
///从后往前比较,如果right大于x值 right --,如果right值小于等于x值 把right赋值给left
while (true && i < j)
{
if (arry[j] <= x)
{
arry[i] = arry[j];
break;
}
else
{
j--;
}
}
///从前往后比较,如果left值小于x left--,如果left值大于等于x值 left赋值给right
while (true && i< j)
{
if (arry[i] > x)
{
arry[j] = arry[i];
break;
}
else
{
i++;
}
}
}
arry[i] = x;
QuickSort(arry, left, i - 1);
QuickSort(arry, i + 1, right);
}
}
归并排序
个人感觉归并排序是分治算法和动态规划算法的结合,首先把一个数组分成两部分,然后对两部分进行分别排序然后合并,在这个排序的基合并的础上,再把它一分为二,直到分的不能再分。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 归并排序
{
class Program
{
static int[] arry = new int[] { 1, 4, 7, 5, 3, 2, 9, 6 };
static int[] tempArry = new int[arry.Length];
static void Main(string[] args)
{
MergeSort(arry, tempArry, 0, 7);
for(int i=0;i<arry.Length;i++)
{
Console.Write(" " + arry[i]);
}
Console.ReadKey();
}
/// <summary>
/// 把数组分成两个部分
/// </summary>
/// <param name="arry"></param>
/// <param name="tempArry"></param>
/// <param name="leftStart"></param>
/// <param name="rightEnd"></param>
static void MergeSort(int []arry,int []tempArry,int leftStart,int rightEnd)
{
if(leftStart<rightEnd)
{
int middle = (leftStart + rightEnd) / 2;
MergeSort(arry, tempArry, leftStart, middle);
MergeSort(arry, tempArry, middle+1, rightEnd);
Merge(arry, tempArry, leftStart, middle+1, rightEnd);
}
}
/// <summary>
/// 对数组进行排序和合并,在排序的基础上已经进行了合并
/// </summary>
/// <param name="arry"></param>
/// <param name="tempArry"></param>
/// <param name="leftStart"></param>
/// <param name="center"></param>
/// <param name="rightEnd"></param>
static void Merge(int []arry,int []tempArry,int leftStart,int center,int rightEnd)
{
int leftEnd = center - 1;
int temp = leftStart;
int rightStart = center;
int eleNum = rightEnd - leftStart+1;
//合并的算法:这个数组分为两部分从leftStart到center再从center到righEnd然后把小的值放在临时数组里(ps:这里通常最后一个值没有赋值到临时数组里)
while(leftStart<=leftEnd&&rightStart<=rightEnd)
{
if (arry[leftStart] < arry[rightStart])
{
tempArry[temp++] = arry[leftStart++];
}
else
{
tempArry[temp++] = arry[rightStart++];
}
}
//这里数组剩下的值赋给临时数组,因为在上边leftStart赋值之后自加他的值会不满足判断条件
while (leftStart <= leftEnd)
{
tempArry[temp++] = arry[leftStart++];
}
while (rightStart <= rightEnd)
{
tempArry[temp++] = arry[rightStart++];
}
for (int i=0;i<eleNum;i++,rightEnd--)
{
arry[rightEnd] = tempArry[rightEnd];
}
for(int i = 0;i<tempArry.Length;i++)
{
Console.Write(tempArry[i]+" ");
}
Console.WriteLine("temparry");
for (int i = 0; i < arry.Length; i++)
{
Console.Write(arry[i] + " ");
}
Console.WriteLine("arry");
}
}
}
希尔排序
把一个数组分成几个部分(按增量来分),对他们每个部分进行插入排序,然后将增量减小,在排序,其实是在原数组上进行操作。
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 希尔排序
{
class Program
{
static void Main(string[] args)
{
int[] arry = new int[] { 7, 5, 2, 3, 8, 10, 4, 1 };
for(int gap=arry.Length/2;gap>0;gap/=2)
{
for(int i=gap;i<arry.Length;i++)
{
Insert(arry, gap, i);
}
}
for(int i=0;i<arry.Length;i++)
{
System.Console.WriteLine(arry[i]);
}
System.Console.ReadKey();
}
static void Insert(int []arry,int gap,int i)
{
int index = arry[i];
int j;
for(j=i-gap;j>=0&&index<arry[j];j-=gap)
{
arry[j + gap] = arry[j];
}
arry[j + gap] = index;
}
}
}
这个博客有讲解有讲解
https://blog.youkuaiyun.com/qq_39207948/article/details/80006224?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160367480919724822561556%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160367480919724822561556&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-2-80006224.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F&spm=1018.2118.3001.4187