算法思想:
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
步骤为:
- 从数列中挑出一个元素,称为 "基准"(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
-
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
请参考维基百科的更详细解释:http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
本算法使用递归实现,并且取数组中最右边的值作为中枢值,代码如下所示:
import java.util.Random;
/**
* quick sort implementation, always use the right most item in array as pivot
*
* @author Sun Kui
*/
public class QuickSort1 {
private long[] theArr;
private int nElems;
public QuickSort1(int max) {
theArr = new long[max];
nElems = 0;
}
public void insert(long value) {
theArr[nElems++] = value;
}
public void display() {
System.out.print("A=");
for (int i = 0; i < nElems; i++) {
System.out.print(theArr[i] + " ");
}
System.out.println();
}
public void quickSort() {
this.recQuickSort(0, nElems - 1);
}
public void recQuickSort(int left, int right) {
if (right - left <= 0) {
return;
} else {
long pivot = theArr[right];
int partition = partitionIt(left, right, pivot);
recQuickSort(left, partition - 1);
recQuickSort(partition + 1, right);
}
}
public int partitionIt(int left, int right, long pivot) {
int leftPtr = left - 1;
// right most item is not included, it's used as pivot
// and will be put into right position after partition.
int rightPtr = right;
while (true) {
while (theArr[++leftPtr] < pivot) {
// NOP
}
while (rightPtr > 0 && theArr[--rightPtr] > pivot) {
//NOP
}
if (leftPtr >= rightPtr) {
// here is the position of pivot
break;
} else {
swap(leftPtr, rightPtr);
}
}
// put pivot int the right position
swap(leftPtr, right);
return leftPtr;
}
public void swap(int dex1, int dex2) {
long temp = theArr[dex1];
theArr[dex1] = theArr[dex2];
theArr[dex2] = temp;
}
public static void main(String... args) {
if (args.length < 1) {
System.out.println("Usage: java QuickSort1 number");
return;
}
Random rand = new Random();
int count = Integer.parseInt(args[0]);
QuickSort1 qs = new QuickSort1(count);
for (int i = 0; i < count; i++) {
qs.insert(rand.nextInt(count * count));
}
qs.display();
qs.quickSort();
qs.display();
}
}
end.
分享到:
相关推荐
在C语言中实现链表快速排序,首先需要理解链表和快速排序的基本概念。链表不同于数组,它不连续存储数据,而是通过指针连接各个节点。每个节点包含数据元素和指向下一个节点的指针。快速排序的核心是“分区操作”和...
在C#中实现快速排序,我们通常会用到递归函数。首先,我们需要一个方法来选取枢轴,这可以是数组的第一个元素、最后一个元素,或者数组中间的元素,也可以是三数取中法,即取首、尾、中间三个元素的中位数作为枢轴,...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R....总的来说,这个压缩包提供了一个非递归实现快速排序的完整示例,通过自定义栈的数据结构,实现了快速排序算法,适用于理解和学习快速排序的非递归实现方式。
快排算法的简单实现。... 快速排序原理:从一组数中任意选出一个数,将大于它的数放右边,小于它的数放左边,然后再从左边和右边的俩组数中分别执行此操作,知道组中元素数为1,此时,数组就是有序的了。
### 快速排序的递归简洁实现 #### 分区函数(Partition) 分区是快速排序的核心步骤,其主要目标是选择一个基准元素(pivot),并将所有小于等于该基准的元素移动到基准的左边,所有大于该基准的元素移动到基准的...
根据给定文件的信息,本文将围绕“用Java实现快速排序”的主题进行展开,不仅解析标题与描述中的核心知识点,还会对部分代码示例进行解读,最后结合这些信息给出一个完整的快速排序算法实现。 ### 快速排序算法简介...
JAVA实现快速排序 快速排序是一种高效的排序算法,它的实现可以分为两个部分:基本思想和复杂度分析。在基本思想中,快速排序采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,直到序列中的所有记录均...
C++是面向对象的编程语言,它提供了丰富的库支持和高效的语言特性,非常适合实现各种算法,包括快速排序。在C++中实现快速排序,通常需要以下步骤: 1. **选择基准元素**:可以随机选取数组中的一个元素作为基准,...
全面的排序算法实现,包括插入排序、合并排序、堆排序、快速排序。 堆排序:HeapSort 讲解详见http://blog.csdn.net/fly_yr/article/details/8550701 插入排序:InSertion_Sort 讲解详见...
在Java中,快速排序可以这样实现: ```java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (low ) { int pivotIndex = partition(arr, low, high); quickSort...
以下是一个简单的C++模板类实现快速排序的示例: ```cpp template void quickSort(T arr[], int left, int right) { if (left ) { int pivotIndex = partition(arr, left, right); quickSort(arr, left, pivot...
标题:C语言快速排序算法实现 描述:本文将深入探讨如何使用C语言实现快速排序算法,这是一种高效的排序方法,广泛应用于各种数据结构处理场景。快速排序的基本思想是通过一趟排序将待排记录分隔成独立的两部分,...
快速排序的时间复杂度在最坏情况下为O(n²),但平均情况下为O(n log n),且其内部循环可以在大部分硬件上很高效地实现,因此快速排序通常是实际应用中最常用的排序算法之一。空间复杂度为O(log n),这是由于递归调用...
本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...
快速排序 java实现
这是一个用C语言实现的快速排序的程序,它实现了对一个英文文本中的单词排序并将排序结果输出到另外一个文件中。
快速排序算法C语言实现,快排序算法QuickSort.cpp
用MPI实现的快速排序,提高快速排序的效率
6. **边界处理**:在实际的MIPS快速排序实现中,还需要考虑数组为空或只包含一个元素的情况,这些情况不需要排序,可以直接返回。 7. **优化**:为了提高效率,可以考虑使用尾递归优化,或者在划分过程中减少不必要...
在TIA博途中实现快速排序,我们需要创建两个FC(Function Block)块:一个用于数据交换,另一个用于执行快速排序算法。 1. 数据交换FC块(data_Swap): 这个FC块接收两个输入参数,分别为需要交换的两个元素的...