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[19];
Console.WriteLine("未排序:");
for (int i = 0; i < 19; i++)
{
entry[i] = ra.Next(0, 19);
Console.WriteLine(entry[i]);
}
双选择排序(0, entry.Length - 1, entry);
Console.WriteLine("----------------已排序-----------------------------");
for (int i = 0; i < 19; i++)
{
Console.WriteLine(entry[i]);
}
Console.ReadLine();
}
static void print(int[] entry, int n)
{
for (int i = 0; i < n; i++)
{
Console.WriteLine(entry[i]);
}
}
static void 双选择排序(int start, int end, int[] entry)
{
if (start < end)
{
int max_index = start;
int min_index = start;
select(start, end, entry, ref max_index, ref min_index);找start到end之间的最大值下标和最小值下标
swap(max_index, end, entry);把最大值调到最后
if (min_index == end)如果最小值刚好在end的位置,那最小值已经被调到max_index的位置了【关键】
{
swap(max_index, start, entry);
}
else
swap(min_index, start, entry);
双选择排序(start + 1, end - 1, entry);
}
else
return;
}
static void select(int start, int end, int[] entry, ref int max, ref int min)///在数组中的【start,end】片段找最小值下标和最大值下标
{
for (int i = start; i <= end; i++)
{
if (entry[i] < entry[min])
min = i;
if (entry[i] > entry[max])
max = i;
}
}
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;
}
}
}
}