我想写一个用C++编写快速排序的程序,是从大到小排的,请知道尽快写给我啊,谢谢哦。。。。。。

我想写一个用C++编写快速排序的程序,是从大到小排的,请知道尽快写给我啊,谢谢哦。。。。。。,第1张

/

快排么。网上一搜就一堆了。算法只是一种思想或说成一种方法而已,并非就C语言。其它语言也一样

快排也有点像二路归并:从一个无序的序列中随机取出一个值q做为支点,然后把大于q的放到一边,小于q的放到q的另一边,然后再以q为分界点,分别对q的两边

进行排序(快排时直接再对q两边重新取支点,整理,再取支点,直到支点两旁都有序。也就是支点两旁只有一个数时)

/

#include <stdioh>

#include <stdlibh>

int Qsort(int p[],int beg,int end)

{

if(beg+1>=end)return 0;//退出递归

int low,hight,q;

low=beg;

hight=end;

q=p[low];//q为支点,其实q可以为随机数。但相应以下程序就要改了

while(1){

while(low<hight && p[hight]>q)hight--;

if(low>=hight)break;

p[low++]=p[hight];

while(low<hight && p[low]<q)low++;

p[hight++]=p[low];

}

p[low]=q;

Qsort(p,beg,low-1);

Qsort(p,low+1,end);

}

int main()

{

int i,a[]={1,32,6,4,54,654,6,6,2,76,76,7,66,5,544,334,34,78};

Qsort(a,0,sizeof(a)/4-1);

for(i=0;i<sizeof(a)/4;i++)printf(" %d ",a[i]);

system("pause");

return 0;

}

快速排序的优势和支点元素的选择有关系。

所选支点元素每次递归后都在最前面或最后面。这样情况就会最差了。

我们知道一般的排序。(如冒泡。。)在一个数组p[m,n]中排序。都是确定最大或最小,而确定最大值(最小值)要经过n-m-1次比较。

而整个过程就差不多是(n-m-1)!次比较。

快排中:一次比较可以确定支点元素的位置。若p[m,q,n](q为支点元素)。当然确定第一个元素也是要比较(n-m-1)次。但第二个,第三个(第二层)就是(q-m-1)和(n-q-1)次比较。

明显q的值若为m或n,快排就没有什么优势了

看了LS的回答,还是我水平最高嘛……喔厚厚厚……希望采纳!鞠躬……

//希望对楼主有小小的帮助。。。

//排序的算法是二分法,N的对数时间复杂度。。。

//如果有疑问,我们可以再探讨。。。

#include<stdlibh>

#include<stringh>

#include<stdioh>

bool merge(int array,int p,int q,int r)

{

if(!(p<<q<r)&&p>=0&&r<=sizeof(array)/sizeof(array[0])-1)

{

return false;

}

int left =new int[q-p+1];

int right=new int[r-q];

memcpy(left,array+p,sizeof(int)/sizeof(char)(q-p+1));

memcpy(right,array+q+1,sizeof(int)/sizeof(char)(r-q));

int left_index=0,right_index=0,left_max_index,right_max_index;

left_max_index=q-p+1;

right_max_index=r-q;

for(int k=p;k<=r&&left_index<left_max_index&&right_index<right_max_index;++k)

{

if(left[left_index]<=right[right_index])

{

array[k]=left[left_index];

++left_index;

}

else

{

array[k]=right[right_index];

++right_index;

}

}

if(left_index==left_max_index)

{

for(;k<=r&&right_index<right_max_index;++k,++right_index)

{

array[k]=right[right_index];

}

}

else if(right_index==right_max_index)

{

for(;k<=r&&left_index<left_max_index;++k,++left_index)

{

array[k]=left[left_index];

}

}

delete left;

delete right;

return true;

}

void merge_sort(int array,int p,int r)

{

if(p<r)

{

int q=(r+p)/2;

merge_sort(array,p,q);

merge_sort(array,q+1,r);

merge(array,p,q,r);

}

}

void main()

{

int size,index, array;

//printf("请输入元素个数:");

scanf("%d",&size);

array=(int)malloc(sizesizeof(int));

for(index=0;index<size;index++)

{

//printf("请输入第%d元素:",index+1);

scanf("%d",&array[index]);

}

merge_sort(array,0,size-1);

for(index=0;index<size;index++)

{

printf("%d ",array[index]);

}

printf("\n");

}

其实,最想说明的是那段交换的代码

R[j]^=R[i];

R[i]^=R[j];

R[j]^=R[i];

一定要排除 i==j 的情况。即自己与自己交换的情况。

如:

a=9;

a^=a;/a=0/

a^=a;/a=0/

a^=a;/a=0/

a就不再是10了。

#include<stdioh>

#include<stdlibh>

void quicksort(int R[],int s,int t)

{

int i,j;

int temp;

if(s<t)

{

temp=R[s];/选第一个数作为参照/

/while(i!=j)不要用这种方法判定循环结束,万一i==j-1,i++,j--后 i〉j了,!=这个条件就救不了你了/

for(i=s+1,j=t;i<=j;i++,j--)/不包括参照数,进行左右阵营站队/

{

while(j>i && R[j]>=temp)/R[j]>=temp不要 = 也行,加了更好,毕竟相等的无论站左站右,哪边都无所谓/

j--;

while(i<j && R[i]<=temp)

i++;

if(i!=j){/i千万不能等于j/

R[j]^=R[i];

R[i]^=R[j];

R[j]^=R[i];

}

}

i--;

if(R[s]<R[i])i--;/调整i的值,使i指向最后一个小于等于参照数的位置/

/将参照数 与 最后一个小于等于参照数的数进行交换,这样就真正把左右两个阵营分开了/

R[s]=R[i];

R[i]=temp;

quicksort(R,s,i-1);

quicksort(R,i+1,t);

}

}

int main(void)

{

int i;

int a[]={5,3,2,1,9,8,7,4,5};

quicksort(a,0,sizeof(a)/sizeof(int)-1);

for(i=0;i<sizeof(a)/sizeof(int);i++)

printf("%d ",(a+i));

return 0;

}

能简短的说明一下你想要什么么,我的理解是给我一个数组,让我排序,最后输出一个从小到大(或从大到小)的数组的原数组元素下表。

比如是s[10]={21,51,12,0,61,81,91,41,71,31} 排序后a[10]={0,12,21,31,41,51,61,71,81,91}

输出为3,2,0,9,7,1,4,8,5,6对应0:s[3]=0,1:s[2]=12,2:s[0]=21,。。。。。。是这样不?

快速排序是基于分治思想的排序算法。

一般的快排是把大于第一个数的放到右边,小于第一个数的放到左边,然后再对分成的两部分递归。

很简单的一个算法。

现在这里没有编译器,代码不好敲。如果你理解能力或动手能力比较差非常需要代码的话,就追问吧~~

以上就是关于我想写一个用C++编写快速排序的程序,是从大到小排的,请知道尽快写给我啊,谢谢哦。。。。。。全部的内容,包括:我想写一个用C++编写快速排序的程序,是从大到小排的,请知道尽快写给我啊,谢谢哦。。。。。。、用C语言编写函数实现快速排序(升序),在主函数中输入数组数据,并调用该数得到排序结果。、菜鸟提问 c语言关于快速排序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10140586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存