我用的是C#实现的,思路不变,也就是比基准数大的数放在基准数右边,比基准数小的数放在基准数的左边 ,是看了一张图写来的(某个贴找到的),实现方法是用一个for循环找到比基准小的数然后让它下标连续,下标连续的实现方法创了一个count来记数,利用基准数与count之差,若下标连续则它们之差不变,不然则交换数让它连续,最后让基准数与一排较小的连续的数的最后一位交换,完成一次的分区,然后我只想出一次的分区,递归是看另一个贴想出来的,但算法新的实现是我一个人想几天想出来的,并未抄袭任何人,属于原创。
让我想出递归的教程很不错,大家可以一起看:
using System;
namespace ConsoleApp3
{
class Program
{
static void sort(int[] intArr, int low, int high)
{
if (low >= high)
{
return;
}
//处理一个分区
int temp, count = 0;
for (int i = low; i <= high; i++)
{
//找到不连继的数,让它连继,即分区
if (intArr[low] >= intArr[i])
{
if ((i - count) != low)
{
temp = intArr[i];
intArr[i] = intArr[low + count];
intArr[low + count] = temp;
}
count++;
}
}
temp = intArr[low];
intArr[low] = intArr[low + count - 1];
intArr[low + count - 1] = temp;
sort(intArr, low, low + count - 2);
sort(intArr, low + count, high);
}
static void Main(string[] args)
{
int[] intArr = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 15,12,14,147,597,156,752,4102,9,911,145,99, 666,47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 15, 12, 14, 147, 597, 156, 752, 4102, 9, 911, 145, 99, 666 };
// int[] intArr{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
sort(intArr, 0, intArr.Length-1);
for (int i = 0; i < intArr.Length; i++)
{
Console.Write(intArr[i]+",");
}
}
}
}