import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 泛型实现的快速排序算法
*
* @version 1.0 2011-07-13 09:53
* @author 鬼辅神攻
*
*/
public class QuickSort {
public static void main(String[] args) {
Random rand = new Random();
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 50; i++) {
list.add(rand.nextInt(100 + 1));
}
System.out.println(list.toString());
long begin = System.currentTimeMillis();
sort(list, 0, list.size() - 1);
long end = System.currentTimeMillis();
System.out.println("[cost time]:" + (end - begin));
for (int i = 0; i < list.size() - 1; i++) {
System.out.println(list.toString());
}
}
/**
* 分组算法
*
* @param <T>
* 实现了Comparable接口的类型
* @param list
* 输入的排序列表
* @param start
* 输入的排序列表中需要分组的下限
* @param end
* 输入的排序列表中需要分组的上限
* @return 分组的索引
*/
protected static <T extends Comparable<T>> int partition(List<T> list,
int start, int end) {
T keyValue = list.get(start);
while (true) {
int startOrg = start;
int endOrg = end;
// 左右各寻找不符合分组规则的数字,并交换位置。
while (!(list.get(end).compareTo(keyValue) < 0) && end > startOrg) {
end--;
}
while (!(list.get(start).compareTo(keyValue) >= 0)
&& start < endOrg) {
start++;
}
if (start < end) {
swap(list, start, end);
} else {
return end;
}
}
}
/**
* 交换两个位置的值
*
* @param <T>
* @param list
* 列表
* @param i
* @param j
*/
private static <T> void swap(List<T> list, int i, int j) {
T tmp = list.get(i);
list.set(i, list.get(j));
list.set(j, tmp);
}
/**
* 快速排序递归算法
*
* @param <T>
* 实现了Comparable接口
* @param list
* 待排序列表
* @param start
* 下标下限
* @param end
* 下标上限
*/
protected static <T extends Comparable<T>> void sort(List<T> list,
int start, int end) {
int splitKey = partition(list, start, end);
if (splitKey > start)
sort(list, start, splitKey);
if (splitKey + 1 < end)
sort(list, splitKey + 1, end);
}
/**
* 对用户友好的接口
*
* @param list
* 待排序列表
*/
public static void sort(List<Integer> list) {
sort(list, 0, list.size() - 1);
}
}
分享到:
相关推荐
在Java中,我们可以利用泛型来实现快速排序,这样就可以让排序功能适用于多种数据类型。泛型是Java中的一项重要特性,它允许在编译时检查类型安全,并且可以与任何引用类型一起工作。在快速排序的泛型实现中,我们...
快速排序算法的核心是`partition`部分,它负责将数组划分为两部分,并返回基准元素的最终位置。这个过程通常通过一趟遍历来完成,选择一个基准元素,然后将所有小于基准的元素放在其左边,大于基准的元素放在右边。...
以下是对"各种排序算法的C++泛型实现"这个主题的详细解析。 1. **C++ 泛型编程**: C++中的模板是一种泛型编程工具,它允许我们创建函数或类,这些函数或类可以处理多种数据类型。在实现排序算法时,使用模板可以...
在C#编程语言中,我们可以利用泛型来实现快速排序,使得该算法可以应用于各种数据类型的数组或集合。 泛型是.NET框架中的一个重要特性,它允许我们在不指定具体类型的情况下定义类、接口和方法,从而提高了代码的...
在编程领域,排序算法是数据处理中的基础,它在各种应用中都发挥着重要作用。...而选择排序虽然在效率上不如快速排序或归并排序,但其简单的实现和固定的比较次数在某些特定场景下仍然具有一定的价值。
总结来说,这个项目重点在于理解和实现快速排序算法,通过操作符重载提供灵活的比较方式,利用模板实现泛型排序,确保代码能在不同的数据类型上工作,并且所有这些都在Visual Studio 2005环境下进行了测试和调试。...
综上所述,这个小型排序系统展示了泛型的强大灵活性,以及多种排序算法的实现和比较。开发者可以根据实际需求选择合适的排序方法,同时也可以通过这个系统学习和理解各种排序算法的原理和性能差异。
本主题聚焦于三种常见的排序算法:插入排序、冒泡排序和快速排序,这些算法都已被实现为C++模板,使得可以应用于各种数据类型。 **插入排序(Insertion Sort)**是一种简单直观的排序算法,它的工作原理类似于我们...
在SCL中实现快速排序,首先需要定义一个函数块(FB),这里我们称为`GF_Quick_Sort`。这个函数块需要接收两个输入参数:一个是要排序的数组,另一个是排序的顺序,可以是升序或降序。同时,还需要定义一个返回值,...
快速排序不是稳定的排序算法。 7. 希尔排序: 希尔排序是插入排序的改进版,通过设定间隔序列来改进元素的交换过程,以减少比较和交换的次数。虽然它比直接插入排序更快,但没有固定的平均时间复杂度,且不稳定。 ...
在这个压缩包中,有两个实现快速排序的例子:"QSORT_old" 和 "QSORT_new"。"QSORT_old" 可能是使用模板函数实现的快速排序,模板函数的优点在于它可以适应不同数据类型的排序需求,提高了代码的复用性。而"QSORT_new...
由于文件中还包含了使用说明,这意味着读者可以得到如何使用这些代码的具体指导,无论是初学者还是有一定编程经验的开发者,都能够通过这份文件快速上手使用快速排序算法,并将其应用到实际的开发工作中去。...
快速排序是一种高效的排序算法,由英国...总的来说,C++的模板类提供了强大的泛型编程能力,使得我们可以编写出高效且通用的代码,如快速排序算法。这种实现方式降低了代码的重复性,提高了代码的可复用性和维护性。
冒泡排序算法虽然在时间效率上不如快速排序、归并排序等高级排序算法,但它在最坏和平均情况下的时间复杂度都为O(n^2),在数据量较少或者基本有序的情况下,冒泡排序仍然是一个不错的选择。对于学习算法和数据结构的...
2. **效率优化**:在实现快速排序时,注意基准元素的选择策略,如“三数取中”可以避免最坏情况的发生。 3. **测试框架**:为了比较排序速度,可以使用计时器(如`std::chrono`库)来测量每种排序算法的运行时间。 4...
例如,`std::sort`可以对容器中的元素进行快速排序;`std::find`用于在序列中查找特定值;`std::binary_search`则是在已排序的容器中进行二分查找。图算法如深度优先搜索(DFS)和广度优先搜索(BFS)在DGL中也有...
在本实验中,我们主要关注的是使用C++编程语言实现三种经典的排序算法:冒泡排序(Bubble Sort)、选择排序(Selection Sort)以及快速排序(Quick Sort)。这些排序算法是计算机科学基础课程中的重要组成部分,它们...
使用泛型的对象排序工具类(使用算法:快速排序),适合初学者学习快速排序的基本原理和实现。
这个包采用了泛型实现,允许用户对任意对象进行排序,只要这些对象实现了Comparable接口或提供了自定义的Comparator。 首先,我们来了解一下泛型在Java中的应用。泛型是Java SE 5.0引入的一个重要特性,它允许在类...
在C++中实现快速排序算法,通常会使用指针和数组下标来访问和交换元素。C++标准库提供了vector容器,它是一个能够存储任意类型的动态数组,非常适合用于快速排序算法中的元素存储。 根据给定的代码示例,快速排序...