刚刚找到工作,但是发现自己虽然对数据结构的知识了解原理,但是实现的话,仍然有很大的麻烦。决定在大学的最后几个月对数据结构进行一个系统的详细的学习。好了,第一篇:快速排序的算法。由于我只是想实现一个简单的原理,所以类的构造就比较简单了,比较的原型都死int型的。
快速的排序的定义我不说了,直接贴源代码:
public class BaseQuickSort implements QuickSortExecutor{
private int[] arrays;
@Override
public void executor() {
if(arrays == null || arrays.length == 0)
{
throw new IllegalArgumentException("array can not be null or length is zero");
}
quickSort(0,arrays.length - 1);
}
private void quickSort(int low,int high)
{
int key = arrays[high];
int begin = low;
int end = high;
int position = high;
int temp ;
while(begin < end){
if(position == end){
if(arrays[begin] <= key)
begin++;
else {
temp = arrays[begin];
arrays[begin] = key;
arrays[position] = temp;
position = begin;
end--;
}
}else if(position == begin)
{
if(arrays[end] >= key)
{
end--;
}else{
temp = arrays[end];
arrays[end] = key;
arrays[position] = temp;
position = end;
begin++;
}
}
}
if(low < position - 1)
quickSort(low, position - 1);
if(position + 1 < high)
quickSort(position + 1,high);
}
public int[] getArrays() {
return arrays;
}
public void setArrays(int[] arrays) {
this.arrays = arrays;
}
public static void main(String[] args) {
BaseQuickSort sort = new BaseQuickSort();
int[] arrays = new int[]{128,137,1898989,55,532,99,12,3,1000,255};
sort.setArrays(arrays);
sort.executor();
for(int i = 0;i< arrays.length ;i++)
{
System.out.print(arrays[i] + " ");
}
}
}
这个的实现是使用的是递归结构,所以说还是比较简单的。下面是一个实现了不使用系统的递归函数,自己定义的一个栈,用来排序,也是快速排序的算法实现:
public class NoStackQuickSort implements QuickSortExecutor{
int[] arrays;
@Override
public void executor() {
if(arrays == null || arrays.length == 0)
{
throw new IllegalArgumentException("array can not be null or length is zero");
}
int[] stack = new int[arrays.length];
int stacktop = 0;
stack[stacktop] = 0;
stacktop++;
stack[stacktop] = arrays.length-1;
stacktop++;
while(stacktop != 0)
{
stacktop--;
int uhigh = stack[stacktop];
stacktop--;
int ulow = stack[stacktop];
if(uhigh > ulow)
{
// 进行排序 获得mid值
int mid = spitArrays(ulow, uhigh);
if(mid - ulow > uhigh - mid)
{
stack[stacktop] = ulow;
stacktop++;
stack[stacktop] = mid - 1;
stacktop++;
if(uhigh > mid)
{
stack[stacktop] = mid+1;
stacktop++;
stack[stacktop] = uhigh;
stacktop++;
}
}else{
stack[stacktop] = mid + 1;
stacktop++;
stack[stacktop] = uhigh;
stacktop++;
if(mid > ulow)
{
stack[stacktop] = ulow;
stacktop++;
stack[stacktop] = mid - 1;
stacktop++;
}
}
}
}
}
private int spitArrays(int low,int high){
int key = arrays[high];
int begin = low;
int end = high;
int position = high;
int temp ;
while(begin < end){
if(position == end){
if(arrays[begin] <= key)
begin++;
else {
temp = arrays[begin];
arrays[begin] = key;
arrays[position] = temp;
position = begin;
end--;
}
}else if(position == begin)
{
if(arrays[end] >= key)
{
end--;
}else{
temp = arrays[end];
arrays[end] = key;
arrays[position] = temp;
position = end;
begin++;
}
}
}
return position;
}
public int[] getArrays() {
return arrays;
}
public void setArrays(int[] arrays) {
this.arrays = arrays;
}
public static void main(String[] args) {
//设置十万个随机数
int length = 10 * 10000;
int[] arrays = new int[length];
int[] copyArrays = new int[length];
int[] bubbleArrays = new int[length];
//开始使用内存的算法
Random random = new Random();
for(int i = 0;i< length;i++)
{
arrays[i] = random.nextInt(Integer.MAX_VALUE);
}
System.arraycopy(arrays, 0, copyArrays, 0, length);
System.arraycopy(arrays, 0, bubbleArrays, 0, length);
//初始化进行测试
for(int i = 0;i<length ;i++)
{
if(arrays[i] != copyArrays[i])
throw new IllegalArgumentException();
}
for(int i = 0;i<length ;i++)
{
if(arrays[i] != bubbleArrays[i])
throw new IllegalArgumentException();
}
BaseQuickSort stackExecutor = new BaseQuickSort();
NoStackQuickSort noStackExecutor = new NoStackQuickSort();
BubbleSortExecutor bubbleExecutor = new BubbleSortExecutor();
stackExecutor.setArrays(arrays);
noStackExecutor.setArrays(copyArrays);
bubbleExecutor.setArrays(bubbleArrays);
long begin = System.currentTimeMillis();
stackExecutor.executor();
long end = System.currentTimeMillis();
System.out.println("运行时间:使用栈:" + (end - begin));
//--------------------------------------
begin = System.currentTimeMillis();
noStackExecutor.executor();
end = System.currentTimeMillis();
System.out.println("运行时间:不使用栈:" + (end - begin));
//-------------------------------------
begin = System.currentTimeMillis();
bubbleExecutor.executor();
end = System.currentTimeMillis();
System.out.println("运行时间,冒泡:" + (end - begin));
//测试是否排序正确
for(int i = 0;i<length ;i++)
{
if(arrays[i] != copyArrays[i])
throw new IllegalArgumentException();
}
for(int i = 0;i<length ;i++)
{
if(arrays[i] != bubbleArrays[i])
throw new IllegalArgumentException();
}
}
}
最后的main函数里面,我对算法进行了测试,发现,快速算法确实比冒泡算法实现快多了,
之所以不设置太多的随机数排序,是因为在冒泡算法的运行效率实在是太低了,在这个算法的测试中,我的冒泡算法的时间通常达到34秒,但是快速排序却是15ms,差距很大啊。
这个测试中,如果仅仅是区别快速排序的两种实现的话,我们可以发现,快速排序的递归函数的时间消耗是小于我们自己写的不是递归的构造快速排序算法。但是在十万的数据一下,二者的时间是相同的。只是在百万的数据量下,才能显示是也是微小的时间差距。
好了,快速排序写完了
分享到:
相关推荐
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and ...由于快速排序的常数因子较小,且在大多数情况下性能良好,因此它是实践中广泛使用的排序算法之一。
快速排序:分别使用Java和Python实现快速排序算法.zip 快速排序:分别使用Java和Python实现快速排序算法.zip 快速排序:分别使用Java和Python实现快速排序算法.zip 快速排序:分别使用Java和Python实现快速排序算法....
Java 算法之快速排序实现代码 快速排序是一种常用的排序算法, Java 实现的快速排序算法主要通过选择一个基准元素,通常选择第一个元素或者最后一个元素,然后通过一趟扫描,将待排序列分成两部分,一部分比基准...
Java实现快速排序算法+编程知识+技术开发; Java实现快速排序算法+编程知识+技术开发; Java实现快速排序算法+编程知识+技术开发; Java实现快速排序算法+编程知识+技术开发; Java实现快速排序算法+编程知识+技术...
总的来说,快速排序和折半查找是计算机科学中不可或缺的算法,通过递归和分治策略,可以在Java中高效地实现这些算法,并结合界面设计,为用户提供直观的交互体验。在实际项目中,理解和掌握这些算法有助于优化数据...
java算法,快速排序、冒泡排序、选择排序 快速排序文章:http://blog.csdn.net/yanwenyuan0304/article/details/51822361 冒泡排序文章:http://blog.csdn.net/yanwenyuan0304/article/details/51819045
根据给定文件的信息,本文将围绕“用Java实现快速排序”的主题进行展开,不仅解析标题与描述中的核心知识点,还会对部分代码示例进行解读,最后结合这些信息给出一个完整的快速排序算法实现。 ### 快速排序算法简介...
下面我们将详细地讲解快速排序算法的java代码实现。 快速排序算法的基本思想 快速排序算法的基本思想是选择一个pivot元素,将数组分成两个部分,一部分元素小于pivot,一部分元素大于pivot,然后递归地对这两个...
JAVA实现快速排序 快速排序是一种高效的排序算法,它的实现可以分为两个部分:基本思想和复杂度分析。在基本思想中,快速排序采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,直到序列中的所有记录均...
总之,这个Java实现的快速排序演示项目不仅提供了排序算法的实现,还考虑到了教育和演示的需求,通过可视化工具帮助用户更好地理解和学习快速排序的工作机制。通过深入研究这个项目,可以加深对快速排序以及分治策略...
### JAVA实现的快速排序 #### 知识点详解 **一、快速排序算法介绍** 快速排序(Quick Sort)是一种非常高效的排序算法,采用分治法(Divide and Conquer)策略来把一个序列分为较小和较大的两个子序列,然后递归...
本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...
在JAVA中,实现这两种排序算法可以使用面向对象的特性,创建一个类如`MaopaoKuaisu.java`,在这个类中定义两个方法,分别实现冒泡排序和快速排序。类的结构可能如下: ```java public class MaopaoKuaisu { public...
在Java中实现快速排序,我们可以遵循以下步骤: 1. **选择基准值(Pivot)**:首先,我们需要从数组中选取一个元素作为基准,这个元素将被用来分割数组。通常选择第一个或最后一个元素,但也可以是随机选取的。 2....
这份资源提供了Java中如何实现快速排序的全面指南。文档中涵盖了快速排序的基本概念,包括如何对数组进行排序以及如何在Java中实现快速排序。此外,文档还包括一个逐步指南,介绍了如何在Java中实现快速排序,包括...
在Java中,我们可以创建一个名为`Qsort`的类来实现快速排序。这个类包含两个主要方法:`sort`和`partition`。`sort`方法是快速排序的递归入口,`partition`方法则是快速排序的核心,它负责将数组分为两部分,并返回...
【作品名称】:基于 Java 实现的快速排序算法(java 实现方式) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于 ...
Java 快速排序,目前来说效率很高的一种排序算法,好理解。
以下是一个简单的`SortUtil.java`文件中的快速排序算法实现: ```java public class SortUtil { public static void quickSort(int[] arr, int low, int high) { if (arr == null || arr.length == 0) return; ...
这是一个用Java语言实现的快速排序算法,快速排序算法是根据分冶思想去实现的。