快速排序算法的修改,,

参考了一下别人的程序,把bug的问题解决了,先把正确的代码贴上,让后分析一下之前的错误:

#include<iostream>
using namespace std;

void vector_initial(int *array,int n);
void vector_print(int *array,int n);
void fast_sort(int *array,int p,int r);
int separate_2part(int *array,int p,int r);

int main()
{
	int a[100];
	int n;
	cout<<"输入数的个数:";
	cin>>n;
	vector_initial(a,n);
	fast_sort(a,0,n-1);
	vector_print(a,n);
	return 0;
}

void vector_initial(int *array,int n)
{	int i=0;
	while(i<n)
	{
		cin>>array[i];
		i++;
	}
}
void vector_print(int *array,int n)
{
	for(int i=0;i<n-1;i++)
		cout<<array[i]<<" ";
	cout<<array[n-1]<<endl;
}

void fast_sort(int *array,int p,int r)
{
	int q;
	if(p<r)
	{
		q=separate_2part(array,p,r);
		fast_sort(array,p,q-1);
		fast_sort(array,q+1,r);
	}
}

int separate_2part(int *array,int p,int r)
{
	int n1,n2,x;
	n1=p;
	n2=r;
	x=array[p];
	while(1)
	{
		while(array[++n1]<x);
		while(array[n2]>x)
			n2--;
		if(n1>=n2) break;
		swap(array[n1],array[n2]);
	}
	for(int i=p+1;i<=n2;i++)
	{
		array[i-1]=array[i];
	}
	array[n2]=x;
	return n2;
}

  

我之前的错误,其实就一处:没有充分考虑清楚n1和n2的大小情况,错误得认为n1只能小于或等于n2,其实,n2-n1可能大于等于1,可能等于0,还可能等于-1,共三种情况。而,之前的代码,把n2-n1大于等于1和等于-1当成一种情况进行处理,即,进行两个数据的交换。在这种情况下,如果n2>n1是对的,如果n2<n1就错啦,排序就乱套了。教训:算法要进行的操作和可能出现的情况,编程之前脑袋里一定要非常非常清晰才行。
时间: 2024-10-10 22:08:00

快速排序算法的修改,,的相关文章

深入理解快速排序算法的稳定性

在初次接触排序算法稳定性这个概念时,我一直认为复杂度为O(n2)的算法是稳定的,复杂度为O(nlogn)的算法是不稳定的.当时是这样理解的,复杂度为O(n2)的算法不可能再坏,而复杂度为O(nlogn)的算法在极端情况下可能会退化为O(n2),例如快速排序.但其实这是错误的,稳定性的概念远没有这么复杂,它只表示两个值相同的元素在排序前后是否有位置变化.如果前后位置变化,则排序算法是稳定的,否则是不稳定的.稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功. 之前对稳

快速排序算法昨晚实现了,,,,但是有个BUG

昨天晚上写好了归并排序的算法,后来就趁热打铁,开始写快速排序算法,代码是越写越熟练,越写越来劲.昨天晚上也就写出来了快速排序算法. 但是在我测试的时候先后出现一些问题: 第一个问题: 1)输入 1 2 3 4 5 6 7  -1时,排序结果2 1 5 6 7 3什么什么的,但是输入8 7 6 5 4 3 2 1 -1时,倒是能排得好好的.天哪,脑袋记不清了,,,我竟然忘了我修改那个地方了,,,真是悲催.我把它修改好了.(应该是修改了,分成两段的过程中,数组小标大小的限时,之前应该没有加左边的下标

快速排序算法的简单理解

快速排序算法的简单理解 本文用的编程语言为python,简单阐释了作者对快速排序算法的学习心得,尽量用通俗易懂的方式向读者表达.如果文章中有什么纰漏与错误,请读者指正. 在了解快速排序之前,我们先来了解一下递归 递归 递归调用自己的函数 先来看一个函数 def (i): print(i) countdown(i-1) 这是一个不断递减的函数,如果调用这个函数,它会无限循环下去.这可不是一件好事.我们应该给予它一些限制,告诉它什么时候停止调用自己,什么时候调用自己.我们把这种限制分别叫做基线条件与

快速排序算法小结

         快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.          假设要排序的数组是a[6],长度为7,首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序.一躺快速排序的算法是: 1).设

排序算法之 Java简单快速排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class SimpleQuick { public int[] sort(int[] arr,int left,int right){ if ( arr == null || a

快速排序算法

快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 稳定性:快速排序是不稳定的排序 时间复杂度: 最好:O(nlogn) 最差:O(n^2) 辅助空间:O(logn) ~ O(n) /* 快速排序算法 */ #include <cstdio> /* 对给定的闭区间进行快速排序 */ void QSort(int* L, int low, int high){ if (low

关于快速排序算法(一个90%的人都不懂其原理、99.9%的人都不能正常写出来的算法.)

一.奇怪的现象 研究快速排序很久了,发现一个古怪的实情:这算法描述起来很简单,写一个正确的出来实在不容易.写一个优秀的快速排序算法更是难上加难. 也难怪该算法提出来过了很久才有人写出一个正确的算法,过了很久才优秀的版本出来. 二.原理描述 从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作

排序算法--快速排序算法解析

一.快速排序算法思路 ①.取待排序列表的第一个元素p,通过归位算法,挪移他到列表中正确的位置. ②.列表被元素p分成两部分,左边都比元素p小,右边都比元素p大. ③.通过递归,在两部分,重复1.2步骤,直至列表有序. 归位算法动画演示: 二.快速排序算法代码示例 1 def partition(l,left,right):#归位算法 2 temp = l[left] #保存归位元素 3 while left <right: 4 while l[right]>=temp and left<

三路快速排序算法

1.三路快速排序算法的基本思想 之前的快速排序算法都是将序列分成<=v和>v或者是<v和>=v的两个部分,而三路快速排序是将序列分成三个部分: <v.=v.>v,如下图所示: 首先v元素还是作为"基准"元素,e表示当前遍历索引值指向的元素,也就是待考虑的元素,从图中可以看出来,整个序列被分成 3个部分,也就是说当我们遍历完成之后整个序列就已经被分成了<v.=v.>v三个部分了,而我们只需要对<v和>v的两个部分 再次递归调用三