我正在尝试对整数数组进行排序。我的“快速排序”算法可以很好地处理10个或更少的数字,但是一旦添加更多,就不能正确对它们进行排序?
无论是否有Shuffle(左,右),它都以相同的方式工作,所以我认为问题不存在。 我将使用该代码对大量数字进行排序,我认为快速排序是我数据中最有效的选择。
export class CustomLoadingOverlay implements ILoadingOverlayAngularComp {
private params: any;
agInit(params): void {
this.params = params;
if (params.template == "overLay1") {
// do something
}
}
}
答案 0 :(得分:0)
修复注释中指出的问题。洗牌相对较慢:
private static int[] data; // fix
private static int Pivot(int left, int right)
{
int pivot = data[left];
while (left <= right)
{
while (data[left] < pivot)
{
left++;
}
while (data[right] > pivot)
{
right--;
}
if (left <= right) // fix
{
// fix deleted 4 lines
int temp = data[left];
data[left] = data[right];
data[right] = temp;
left++; // fix
right--; // fix
}
}
return right; // fix
}
private static void QuickSort(int left, int right)
{
Shuffle(left, right);
if (left < right)
{
int pivot = Pivot(left, right);
QuickSort(left, pivot); // fix
QuickSort(pivot+1, right); // fix
}
}
public static void Shuffle(int lo, int hi)
{
Random rand = new Random();
for (int i = lo; i <= hi; i++)
{
int r = i + rand.Next(hi + 1 - i);
int t = data[i]; data[i] = data[r]; data[r] = t;
}
}
static void Main(string[] args)
{
data = new int[] { 1, 9, 10, 2, 4, 5, 6, 3, 257, -6 }; // fix
long before = Environment.TickCount;
QuickSort(0, data.Length - 1);
long after = Environment.TickCount;
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(data[i]);
}
Console.WriteLine(after - before);
}
基于标准Hoare分区方案的替代代码,其中将数据作为参数传递。
static public void Quicksort(int [] data, int lo, int hi)
{
if (lo >= hi)
return;
int p = data[(lo + hi) / 2];
int i = lo, j = hi;
i--; // partition
j++;
while (true)
{
while (data[++i] < p) ;
while (data[--j] > p) ;
if (i >= j)
break;
int t = data[i];
data[i] = data[j];
data[j] = t;
}
Quicksort(data, lo, j); // recurse
Quicksort(data, j + 1, hi);
}
static void Main(string[] args)
{
const int SIZE = 10*1024*1024;
int [] data = new int[SIZE];
Random r = new Random(1);
Stopwatch sw = new Stopwatch();
for (int i = 0; i < data.Length; i++)
data[i] = r.Next(data.Length);
sw.Start();
Quicksort(data, 0, data.Length - 1);
sw.Stop();
for (int i = 1; i < data.Length; i++)
{
if(data[i] < data[i-1])
Console.WriteLine("failed");
}
Console.WriteLine("milliseconds: {0:D}\n",sw.ElapsedMilliseconds);
}