这个蛋疼的随机产生结果的快速排序

问题描述

public static void quickSort2(int[] sourse, int low, int high){if(low>high)return;int pivot=sourse[low];int i=low;int j=high;if(i<j){while(i<j){while(sourse[i]<pivot&&i<high){i++;}while(sourse[j]>pivot&&j>low){j--;}if(i<j){swap(sourse,i,j);}}if(i>j)swap(sourse,low,j);quickSort2(sourse,low,j-1);quickSort2(sourse,j+1,high);}}public static void main(String[] args){int[] sourse ;sourse=new int[]{1,23,5,-2,-45,73,9,4,7,12,47,126,0,71,40,51,99};quickSort2(sourse, 0, sourse.length-1);System.out.println("快速排序:");printArray(sourse);// 输出到转后数组的值} 以上是自己写的一个快速排序的函数,小测了一下,第一次可以正确执行,第二次CPU就卡在50%,有时候还会报越界错误,真不知道是咋回事?排除了一下是不是因为数组长度太大的问题,但好像与这个没有必然联系,虽然大的时候更容易错。现在测试,又正常了,悲勒个剧的,难道还有随机性?!有木有同学可以帮忙挑一下刺儿的,分析一下代码哪里不太合适? ps:谢谢一楼的回复,三楼有正确答案,这个快速排序和书上一般见到的不太一样,自己看吧。 问题补充好,我改改看问题补充改好后的,注意判断等号,i<j,i==j时的基准与sourse[i]大小的问题: public static void quickSort2(int[] sourse, int low, int high){//System.out.println("基准值:"+sourse[low]);int i=low;int j=high;if(i<j){ int pivot=sourse[low];while(i<j){while(sourse[i]<= pivot&&i<j){i++;}while(sourse[j]>pivot&&i<j){j--;}if(i<j){swap(sourse,i,j);}}if(pivot<sourse[i]) i--;swap(sourse,low,i);quickSort2(sourse,low,i-1);quickSort2(sourse,i+1,high);}}public static void main(String[] args){int[] sourse ;sourse = createArray(20);//sourse=new int[]{1,23,5,-2,-45,73,9,4,7,12,47,126,0,71,40,51,99,99,40,7,12,126};quickSort2(sourse, 0, sourse.length-1);System.out.println("快速排序:");printArray(sourse);// 输出到转后数组的值} 问题补充其它的我都实现了,就是自己写快速时碰到了问题,还是写代码不够仔细

解决方案

对相等的处理有问题导致了死循环每次递归的第一次 sourse[i]总是等于pivot 无意义另外一开始有个if(low>high)的判断后边为啥还要有if(i<j) 而且还漏掉了=
解决方案二:
int[] sourse=new int[]{1,23,5,-2,-45,73,9,4,7,12,47,126,0,71,40,51,99}; for (int i = sourse.length-1; i >0; i--) {for (int j = 0; j < i; j++) {if(sourse[j]>sourse[j+1]){int temp=0;temp=sourse[j];sourse[j]=sourse[j+1];sourse[j+1]=temp;}}} for (int i = 0; i < sourse.length; i++) {System.out.println(sourse[i]);}这样用冒泡不就行了吗?

时间: 2024-11-10 11:53:27

这个蛋疼的随机产生结果的快速排序的相关文章

排序算法

排序|算法 算法是程序设计的精髓,程序设计的实质就是构造解决问题的算法,将其解释为计算机语言. 在这里您可以了解到: 算法定义 伪代码的使用 算法的复杂性 算法设计策略 常用算法 这里所有的算法都以一种类似Pascal语言的伪代码描述,请参阅伪代码的使用. 新增内容 关于数论的算法--数论基本知识(May 6, 2001)动态规划重新整理 (January 15, 2001)图的深度优先遍历 (January 21, 2001) 图的广度优先遍历 (January 21, 2001)图的拓扑排序

[AS功能代码教程10] 数据结构排序算法

一.概论 对于数据的处理工作,排序是其最基本的运算之一.在当今的计算机系统中,花费在排序上的时间占系统CPU运行时间的很大比重.有资料表明,在一些商用计算机上,在排序上的CPU时间达到20%至60%.为了提高计算机的工作效率,人们提出了各种各样的排序方法和算法.这些算法有力地发展.并充分地展示了算法设计的某些重要原则和高超技巧.因此,对于计算专业人员来说掌握排序算法是十分重要的. 二.排序算法简介 本次课程中我们将介绍六种排序方法:插入排序,选择排序,冒泡排序,希尔排序,快速排序及二路归并. <

深入排序算法的多语言实现

 1 排序的基本概念 排序: 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.其确切定义如下: 输入:n个记录R1,R2,-,Rn,其相应的关键字分别为K1,K2,-,Kn. 输出:Ril,Ri2,-,Rin,使得Ki1≤Ki2≤-≤Kin.(或Ki1≥Ki2≥-≥Kin). 排序的稳定性:当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一.在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方

排序算法(3)

  =e then Insertion_Sort(L,p,r)//若L[p..r]足够小则直接对L[p..r]进行插入排序 else begin 2 q:=partition(p,r,L);//将L[p..r]分解为L[p..q]和L[q+1..r]两部分 3 Quick_Sort(p,q,L); //递归排序L[p..q] 4 Quick_Sort(q+1,r,L);//递归排序L[q+1..r] end; end; 对 线性表L[1..n]进行排序,只要调用Quick_Sort(1,n,L)

【编程练习】八大排序算法

  概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序.     当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序.    快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序-直接插入排序(Straight Insertion Sort) 基本思想:

数据结构与算法C#版笔记--排序(Sort)-下

5.堆排序(HeapSort) 在接触"堆排序"前,先回顾一下数据结构C#版笔记--树与二叉树 ,其中提到了"完全二叉树"有一些重要的数学特性: 上图就是一颗完全二叉树,如果每个节点按从上到下,从左至右标上序号,则可以用数组来实现顺性存储,同时其序号: 1.如果i>1,则序号为i的父结节序号为i/2(这里/指整除) 言外之意:整个数组前一半都是父节点,后一半则是叶节点 2.如果2*i<=n(这里n为整颗树的节点总数),则序号为i的左子节点序号为2*i 3

《算法基础:打开算法之门》一3.6 小结

3.6 小结 在本章和上一章中,我们已经看到了关于查找的4个算法和关于排序的4个算法.我们将它们的特性总结在以下两个表中.因为第2章的3个查找算法仅仅是关于同一个题目的变形,我们将BETTERLINEARSEARCH或SENTINELLINEARSEARCH作为线性查找的代表均可. 这两个表中没有显示平均情况下的运行时间,因为除了典型的快速排序外,其他算法的平均情况下的运行时间均与最坏情况下的运行时间一致.我们已经学习了,当数组元素按顺序随机产生时,快速排序平均情况下的运行时间仅仅是Θ(

c++中八大排序算法_C 语言

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短:  1.插入排序-直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入

C/C++实现八大排序算法汇总_C 语言

概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1. 插入排序-直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已