【忠告】:1.记好了,大家上大学千万别【和鸡疯】!
【腹蛋】抓了好几个学生了!!!
2.抓学生有用吗????【妓院】【院长】却没被【靠】!不是,打错字了,是【没 被铐】,【靠你大爷的】!!!
————————————————
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 双选择排序
{
class Program
{
static void Main(string[] args)
{
Random ra = new Random();
int[] entry = new int[50];
Console.WriteLine("未排序:");
for (int i = 0; i < entry.Length; i++)
{
entry[i] = ra.Next(0, entry.Length);
Console.Write(" " + entry[i]);
if ((i+1)% 10 == 0)
Console.WriteLine("");
}
//双选择排序(0, entry.Length-1, entry);
二分对调(0, entry.Length - 1, entry);
Console.WriteLine("----------------已排序-----------------------------");
for (int i = 0; i < entry.Length; i++)
{
Console.Write(" "+entry[i]);
if ((i+1)% 10 == 0)
Console.WriteLine("");
}
Console.ReadLine();
}
static void print(int[] entry, int n)
{
for (int i = 0; i < n; i++)
{
Console.WriteLine(entry[i]);
}
}
/// <summary>
/// ///
/// </summary>
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="entry"></param>
/// 【【【【【【【【关键函数】】】】】】】】】
//【递归】:1.进入函数时,分割成左右两半,【算法思想】:使【右边的数】都比【左边的数】【大】【这样就可以了】
static void 二分对调(int start, int end, int[] entry)
{
if(end-start>1)//【当前数段】个数为2个以上时
{
int mid=(start+end)/2;//分割点
int l_max_index=0;//左半最大值的下标
int r_max_index = 0;//右半最大值的下标
int r_min_index = 0;//右半最小值的下标
/* if(Max(start,mid,entry,ref l_max_index)>Max(mid+1,end,entry,ref r_max_index))///左半的最大值>右半的最大值
swap(l_max_index,r_max_index,entry);//进行对调
*这个多余的。。
while(Max(start,mid,entry,ref l_max_index)>Min(mid+1,end,entry,ref r_min_index))/【关键】左半的最大值>右半的最小值时,进行对调
swap(l_max_index,r_min_index,entry);
二分对调(start,mid,entry);///【使用递归】对左半部分进行操作
二分对调(mid + 1, end, entry);///【使用递归】对右半部分进行操作
}
else if(end-start==1)//【结束点】【当前数段】个数为2个时
{
if(entry[end]<entry[start])
swap(end,start,entry);
}
else【结束点】【当前数段】只有一个数时
return;
}
static int Max(int start, int end, int[] entry, ref int max_index)///数组的[start,end]数段中的最大值
{
max_index = start;
for (int i = start; i <= end; i++)
{
if (entry[i] > entry[max_index])
max_index = i;
}
return entry[max_index];
}
static int Min(int start, int end, int[] entry, ref int min_index)///数组的[start,end]数段中的最大值
{
min_index = start;
for (int i = start; i <= end; i++)
{
if (entry[i] <entry[min_index])
min_index = i;
}
return entry[min_index];
}
static void swap(int a, int b, int[] entry)///交换数组中下标为a和b的两个数
///
{
if (a != b)
{
int temp;
temp = entry[a];
entry[a] = entry[b];
entry[b] = temp;
}
}
}
}