我编写了一个程序,包含QuickSort来对包含在向量中的一些数据进行排序
我参考了.-- Mark Allen Weiss,但当我在VS2015&& amp; G ++ 4.8,编程失败。
只有我确定我的程序的其他部分是正确的。 一些数据生成,并将它们读取到矢量 (比较QuickSort和MergeSort之间的属性,而MergeSort在文本时顺利进行)void QuickSort(vector<int> &a) {
QuickSort(a, 0, a.size() - 1);
}
int median3(vector<int> &a, int left, int right) {
int mid = (left + right) >> 1;
if (a[mid] < a[left])
swap(a[left], a[mid]);
if (a[right] < a[left])
swap(a[left], a[right]);
if (a[right] < a[mid])
swap(a[mid], a[right]);
swap(a[mid], a[right - 1]);
return a[right - 1];
}
void QuickSort(vector<int> &a, int left, int right) {
//if (left + 10 <= right) {
int pivot = median3(a, left, right);
// begin partitioning
int i = left, j = right -1;
for ( ; ; ) {
while (a[++i] < pivot){ }
while (pivot < a[--j]){ }
if (i < j)
swap(a[i], a[j]);
else break;
}
swap(a[i], a[right - 1]); // restore pivot
QuickSort(a, left, i - 1); // store small element
QuickSort(a, i + 1, right); // store large element
// }
// else
// InsertionSort(a, left, right);
}
在VS&amp;&amp;中编译成功G ++,而VS givin警告: 函数可能会导致运行时堆栈溢出
我困惑了两天,太伤心了。 。 。
答案 0 :(得分:0)
在将public ThreadSafePainter() {
...
synchronized (this) {
this.dataList = getUpdatedData();
}
...
}
public void onPaint(Graphics2D g) {
...
synchronized (this) {
for (String data : dataList)
...
}
}
传递给right
之前,您需要确保left
大于QuickSort(a, left, right)
。否则,当您尝试访问a[]
时,该位置可能会超出范围。
此外,您无需在median3
中将支点交换到最后,然后在QuickSort
中“恢复”它。只需让你的i
和j
索引从向量的两端开始,然后将小于数据透视的数字与大于数据透视的数字交换。
void QuickSort(vector<int> &a, int left, int right) {
int pivot = a[(left + right) / 2];
// begin partitioning
int i = left, j = right;
for ( ; ;) {
while (a[i] < pivot){ ++i; }
while (pivot < a[j]){ --j; }
if (i < j){
swap(a[i], a[j]);
}
else break;
}
if (left < i-1) QuickSort(a, left, i - 1); // store small element
if (i+1 < right) QuickSort(a, i + 1, right); // store large element
}