Tag: quicksort

等待Executor中的所有线程完成?

我正在实现一个parellel quicksort作为编程实践,在我完成之后,我阅读了Executors上的Java教程页面,听起来他们可以让我的代码更快。 不幸的是,我依靠join()来确保程序不会继续,直到所有内容都被排序。 现在我正在使用: public static void quicksort(double[] a, int left, int right) { if (right <= left) return; int i = partition(a, left, right); // threads is an AtomicInteger I'm using to make sure I don't // spawn a billion threads. if(threads.get() < 5){ // ThreadSort's run method just calls quicksort() Future leftThread = […]

Java中的递归Quicksort的分区实现不起作用

写了这个递归快速排序算法的Java实现,并且似乎出错了,因为我尝试排序的数组几乎完全排序,除了应该切换的两个元素(靠近数组的中间)。 我想要排序的整数数组是:4,77,98,30,20,50,77,22,49,2(10个元素)。 这是我的代码: public static void quickSort(int[] array, int start, int end) { if (start < end) { int partition = partition(array, start, end); quickSort(array, start, partition – 1); quickSort(array, partition + 1, end); } } public static int partition(int[] array, int left, int right) { int pivotValue = array[(left + right) / 2]; //Value […]

Quicksort(Java)导致stack.verFlow在array.length> 60k

我的代码正常工作(据我所知),直到我的输入数组大小( a.length )大约为62,000,此时我一直得到StackOverFlowError 。 我以前曾使用2次递归调用quicksort (小于和大于数据透视q ),然后我切换到尾递归。 如您所见,我选择了pivot作为数组末尾的值。 我知道这不是选择枢轴的最佳方法,但我仍然不应该看到StackOverFlowError的数组大小这么小,对吗? 可能是什么导致了这个? 提前致谢! 这是我的代码: public static void quicksort(int[] a, int p, int r) { int q; while (p < r) { q = partition(a, p, r); quicksort(a, p, q – 1); p = q + 1; } } public static int partition(int[] a, int p, int r) […]

Java中的随机数据集快速排序

可能重复: 使用Java中的随机数据库快速排序 下面编写的Quicksort代码使用数组的第一个元素作为pivot,然后对数组进行排序。 现在我想随机选择枢轴而不是第一个,然后对数组进行排序,我被卡住了请告诉我在下面的代码中可以做出哪些更改以获得完美的结果。 import java.util.*; import javax.swing.JOptionPane; public class Quicksort { public static void main(String[] args) { String arraylength = JOptionPane.showInputDialog(“Enter the length of the array.”); int a = Integer.parseInt(arraylength); if (a == 0) { System.out.println(“Null Length”); } else { int[] list = new int[a]; for (int i = 0; i < a; i++) […]

在Java中,如何快速排序排序字段为多层深度的对象的ArrayList?

基本上,我有一个名为“Employees”的Container类,其中包含一个ArrayList。 此ArrayList包含“Employee”对象,后者又包含“EmployeeData”对象,而这些对象又包含String对象,例如“first”或“last”(这是员工姓名)。 这是ArrayList结构的图表: ArrayList[Employee] emps ==> 1:Many ==> Employee emp Employee emp ==> 1:1 ==> EmployeeData data EmployeeData data ==> 1:2 ==> String last // A string that contains employee’s last name. 我将如何在ArrayList上执行快速排序,以便其中的“Employee”对象基于String对象“last”按字母顺序排列? 看起来有点复杂! 这是我class级的基本设计: class Employees{ //data: private ArrayList emps = new ArrayList(); //Some constructors go here //Methods to add, remove, toString, etc, go […]

简单的QuickSort算法给出堆栈溢出错误?

我的朋友有一个小问题,我知道了。 他写了一个简单的(他在学校里得到它)QuickSort算法它产生了一个StackOverflow错误。 我知道这意味着它在某个地方调用自己递归太多次了,但我无法得到逻辑错误 – 请帮助我! 这是代码(我省略了一些代码,因为它只是在2个文本区域中显示): int array [] = new int [10]; … public static void quicksort (int array[],int l,int r){ int i = l; int j = r; int mitte = array [(l+r)/2]; while (i<j) { while (array[i]<mitte) { i++; } // end of if while (mitte<array[i]) { j–; } // end of […]

双链表上的QuickSort

我想在同步双链表上实现QuickSort算法。 我给左边框和右边框的function“分区”,然后它开始搜索左侧的较低值并将较大的值放在右侧。 这是有效的,因为我的枢轴元素总是最右边的,并且在这个步骤之后它位于中间。 我总是得到一个无尽的循环,我不知道为什么? 也许错误的中止条件? 她的代码: private void quickSortRec(DoublyLinkedList in, ListElement l, ListElement r) { ListElement pivot = partition(in, l, r); if(pivot!=null && l!=r){ quickSortRec(in, in.first, pivot.prev); quickSortRec(in, pivot.next, in.first.prev); } } public ListElement partition(DoublyLinkedList in, ListElement l, ListElement r){ ListElement pivot = r; ListElement walker = l; if(l!=r){ while(walker != pivot){ if(walker.getKey() >= pivot.getKey()){ […]

非递归QuickSort

我很想知道我的非递归QuickSort算法的实现有些缺点或隐藏的岩石。 应该修改什么才能优化它? 以我的方式比较两个对象会发生什么问题? public class QuickSort { private Integer first, last, boundLo, boundHi, pivot; Integer temp[] = {0, 0}; public void sort(NewArrayList vect) { Deque stack = new ArrayDeque(); first = 0; last = vect.size() – 1; stack.push(new Integer[] {first, last}); while(!stack.isEmpty()) { sortStep(vect, stack); } } private void sortStep(NewArrayList vect, Deque stack) { // […]

Java中的Inplace Quicksort

为了刷新一些Java,我试图实现一个可以对整数数组进行排序的快速排序(inplace)算法。 以下是我到目前为止的代码。 你可以通过sort(a,0,a.length-1)来调用它。 如果两个’指针’ i,j指向与数据透视表具有相同值的数组条目,则此代码显然会失败(进入无限循环)。 pivot元素v始终是当前分区的最右侧(具有最大索引的分区)。 但我无法弄清楚如何避免这种情况,是否有人看到了解决方案? static void sort(int a[], int left, int right) { if (right > left){ int i=left, j=right-1, tmp; int v = a[right]; //pivot int counter = 0; do { while(a[i]0 && a[j]>v)j–; if( i < j){ tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } while(i < […]

使用quickSort时得到stackoverflower错误,我可以增加堆栈和堆吗?

我可以在java中增加堆栈和堆吗? 我正在使用BlueJ。 ======== 编辑: 这是代码: // ***** Quick-Sort Method ***** public static void quickSort(int[] data, int first, int n) { int p, n1, n2; if(n > 1) { p = partition(data, first, n); n1 = p – first; n2 = n – n1 – 1; quickSort(data, first, n1); quickSort(data, p+1, n2); } } // ***** […]