排序算法
冒泡排序
两数相比,大数放后
时间复杂度为O(n²)
BubbleSort.cs
public class BubbleSort
{
public static void bubbleSort(ref int[] a)
{
int m=a.Length;
for(int i=0;i<m;i++)
{
for(int j=0;j<m-1-i;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
}
Program.cs
class Test
{
static void Main(string[] arg)
{
int[] A=new int[]{12,8,9,1,15,2,7,20,30};
BubbleSort.bubbleSort(ref A);
foreach (var item in A)
{
System.Console.WriteLine(item);
}
}
}
泛型
public class BubbleSort
{
public static void bubbleSort<T>(ref T[] a)where T:IComparable<T>
{
int m=a.Length;
for(int i=0;i<m;i++)
{
for(int j=0;j<m-1-i;j++)
{
if(a[j].CompareTo(a[j+1])>0)
{
T temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
}
选择排序
选择数组中最小的值,将其插回前面
时间复杂度为O(n²)
SelectSort.cs
public class SelectSort
{
public static void selectSort<T>(ref T[] a)where T:IComparable<T>
{
int m=a.Length;
for(int i=0;i<m;i++)
{
int min=i;
for(int j=i+1;j<m;j++)
{
if(a[j].CompareTo(a[min])<0)
{
min=j;
}
}
T temp=a[min];
a[min]=a[i];
a[i]=temp;
}
}
}
插入排序
每次都与前面的数相比,前面的数大于此时所指定的数,则右移
时间复杂度O(n²)
InsertSort.cs
public class InsertSort
{
public static void Sort(ref int[] a)
{
int n=a.Length;
for(int i=1;i<n;i++)
{
int e=a[i];
int j;
for(j=i;j>0;j--)
{
if(e<a[j-1])
a[j]=a[j-1];
else
break;
}
a[j]=e;
}
}
}
归并排列
时间复杂度O(nlogn)
中间左右必须是有序数组
public class MergaSort
{
public static void Sort(int [] arr,int l,int r)
{
int[] temp=new int[arr.Length];
int mid=l+(r-l)/2;
Merga(arr,temp,l,mid,r);
}
public static void Merga(int[] arr,int[] temp,int l,int mid,int r)
{
int i=l;
int j=mid+1;
int k=l;
while(i<=mid&&j<=r)
{
if(arr[i]<arr[j])
{
temp[k++]=arr[i++];
}
else
{
temp[k++]=arr[j++];
}
}
while(i<=mid)
{
temp[k++]=arr[i++];
}
while(j<=r)
{
temp[k++]=arr[j++];
}
for(int z=l;z<=r;z++)
{
arr[z]=temp[z];
}
}
}
左右无需有序
public class MergaSort
{
public static void Sort(int [] arr)
{
int[] temp=new int[arr.Length];
Rank(arr,temp,0,arr.Length-1);
}
public static void Rank(int[] arr,int[] temp,int l,int r)
{
if(l>=r) return;
int mid=l+(r-l)/2;
Rank(arr,temp,l,mid);
Rank(arr,temp,mid+1,r);
Merga(arr,temp,l,mid,r);
}
public static void Merga(int[] arr,int[] temp,int l,int mid,int r)
{
int i=l;
int j=mid+1;
int k=l;
while(i<=mid&&j<=r)
{
if(arr[i]<arr[j])
{
temp[k++]=arr[i++];
}
else
{
temp[k++]=arr[j++];
}
}
while(i<=mid)
{
temp[k++]=arr[i++];
}
while(j<=r)
{
temp[k++]=arr[j++];
}
for(int z=l;z<=r;z++)
{
arr[z]=temp[z];
}
}
}
快速排列
时间复杂度O(nlogn)
针对随机数组
public class Quick
{
public static void Sort(int[] arr,int l,int r)
{
if(l>=r) return;
int v=arr[l];
int j=l;
for(int i=l+1;i<=r;i++)
{
if(arr[i]<v)
{
j++;
Swap(arr,i,j);
}
}
Swap(arr,j,l);
Sort(arr,l,j-1);
Sort(arr,j+1,r);
}
public static void Swap(int[] arr,int i,int j)
{
int e=arr[i];
arr[i]=arr[j];
arr[j]=e;
}
}
有序数组
public class Quick
{
private static Random random=new Random();
public static void Sort(int[] arr,int l,int r)
{
if(l>=r) return;
int p=l+random.Next(r-l+1);
Swap(arr,l,p);
int v=arr[l];
int j=l;
for(int i=l+1;i<=r;i++)
{
if(arr[i]<v)
{
j++;
Swap(arr,i,j);
}
}
Swap(arr,j,l);
Sort(arr,l,j-1);
Sort(arr,j+1,r);
}
public static void Swap(int[] arr,int i,int j)
{
int e=arr[i];
arr[i]=arr[j];
arr[j]=e;
}
}
大量重复数据
public static void Three(int[] arr,int l,int r)
{
if(l>=r) return;
int v=arr[l];
int lt=l;
int gt=r+1;
int i=l+1;
while(i<gt)
{
if(arr[i]<v)
{
lt++;
Swap(arr,i,lt);
}
if(arr[i]>v)
{
gt--;
Swap(arr,i,gt);
}
else
{
i++;
}
}
Swap(arr,l,lt);
Sort(arr,l,lt-1);
Sort(arr,gt,r);
}
}
猴子排序
点击查看代码
public class Monkey
{
public static void MonkeySort(int[] arr)
{
int count=0;
while(!Checkout(arr))
{
Sort(arr);
count++;
}
System.Console.WriteLine($"最终排列次数:{count}");
}
public static void Sort(int[] arr)
{
Random random=new Random();
int temp;
for(int index=0;index<arr.Length;index++)
{
int j=random.Next(arr.Length);
temp=arr[j];
arr[j]=arr[index];
arr[index]=temp;
}
}
//判断是否有序
public static bool Checkout(int[] arr)
{
for(int i=0;i<arr.Length-1;i++)
{
if(arr[i]>arr[i+1])
{
return false;
}
}
return true;
}
}

浙公网安备 33010602011771号