C语言快速排序问题!

作者&投稿:荀顾 (若有异议请与网页底部的电邮联系)
C语言中的一趟快速排序问题~

第一,你main里面,把一个没有分配内容的指针L拿来直接用就错了。
第二,quicksort是分而治之,是逐层分。每次partition之后,分成两部分,一边比哨兵小,一边比哨兵大。应该对于这两部分分别继续quicksort。递归的做。你只partition了一次,所以,这一次能不能正好排对就靠运气了。
我给你改了一下,你看看对不对。
#include#define MAXSIZE 1000typedef struct{int r[MAXSIZE+1];int length;}SqList;void swap(SqList *L,int i,int j){int temp=L->r[i];L->r[i]=L->r[j];L->r[j]=temp;}int Partition(SqList *L,int low,int high){int pivotkey;pivotkey=L->r[low];while(lowr[high]>=pivotkey) high--;swap(L,low,high);while(lowr[low] low+1) QuickSort(L, low, key-1); if(key < high-1) QuickSort(L, key+1, high);}int main(){ SqList L; int i,j; int low=0,high; printf("请输入排序个数:"); scanf("%d",&i); high=i-1; printf("请输入元素:"); for(j=0;j<i;j++) { scanf("%d",&L.r[j]); } QuickSort(&L,low,high); for(j=0;j<i;j++) { printf("%d ",L.r[j]); }}

#include

int partions(int l[],int low,int high)
{
int prvotkey=l[low];
l[0]=l[low];
while (low<high)
{
while (low=prvotkey)
--high;
l[low]=l[high];
while (low<high&&l[low]<=prvotkey)
++low;
l[high]=l[low];
}

l[low]=l[0];
return low;
}

void qsort(int l[],int low,int high)
{
int prvotloc;
if(low<high)
{
prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴
qsort(l,low,prvotloc-1); //递归调用排序 由low 到prvotloc-1
qsort(l,prvotloc+1,high); //递归调用排序 由 prvotloc+1到 high

}
}

void quicksort(int l[],int n)
{
qsort(l,1,n); //第一个作为枢轴 ,从第一个排到第n个
}

void main()
{
int a[11]={0,2,32,43,23,45,36,57,14,27,39};

for (int b=1;b<11;b++)
printf("%3d",a[b]);

printf("
");
quicksort(a,11);

for(int c=1;c<11;c++)
printf("%3d",a[c]);

}

问题解决了吗

给你提供两种排序方式,希望帮到你,看程序:

#include<stdio.h> 
#include<string.h> 

void bubble(int *a,int n);      //  冒泡法, 定义两个参数:数组首地址与数组大小
void choise(int *a,int n);      //  选择法,排序 

int main() 
{
 int a[11]={1,5,6,8,4,2,10,56,20,55}; 
 int i;
 
  printf("
冒泡排序
"); 
  bubble(a,10);
   for(i=0;i<10;i++) 
     printf("%d ,",a[i]); 

  printf("
选择排序
"); 
  choise(a,10);
   for(i=0;i<10;i++) 
     printf("%d ,",a[i]); 



 }


void bubble(int *a,int n)   // 冒泡法,排序  定义两个参数:数组首地址与数组大小

int i,j,temp; 
for(i=0;i<n-1;i++) 
for(j=i+1;j<n;j++)  // 注意循环的上下限
if(a[i]>a[j]) 

temp=a[i]; 
a[i]=a[j]; 
a[j]=temp; 



void choise(int *a,int n) //  选择法,排序 

int i,j,k,temp; 
for(i=0;i<n-1;i++) 

k=i;               /*给记号赋值*/ 
for(j=i+1;j<n;j++) 
if(a[k]>a[j]) 
k=j;       /*是k总是指向最小元素*/ 
if(i!=k) 
{              /*当k!=i是才交换,否则a[i]即为最小*/ 
temp=a[i]; 
a[i]=a[k]; 
a[k]=temp; 


}


这个不难:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int partion(int a[],int p,int r)
{
    srand((unsigned)time( NULL));
    int e=rand()%(r-p+1)+p;
    int tem;
    tem=a[e];
    a[e]=a[r];
    a[r]=tem;
    int x=a[r], i=p-1;
    for (int j=p;j<r;j++)

        if (a[j]<=x)
{
            tem=a[i+1];
            a[i+1]=a[j];
            a[j]=tem;
            i++;
        }
    }
    tem=a[r];
    a[r]=a[i+1];
    a[i+1]=tem;
    return i+1;
}
 
void QuickSort(int a[],int p,int r)
{
    if (p<r)
{
        int q=partion(a,p,r);
        QuickSort(a,p,q-1);
        QuickSort(a,q+1,r);
    }
}
 
int main()
{
    int array[]={1,5,6,8,4,2,10,56,20,55};
int i;
    QuickSort(array,0,9);
    for(i=0;i<10;i++)
        printf("%d ",array[i]);
    printf("
");
    return 0;
 }

以下是运行截图:

满意请采纳!



//最快调用库函数的快速排序就可以了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LENGTH(x) sizeof(x)/sizeof(x[0])
int main(void)
{
int arr[10]={
1,5,6,8,4,2,10,56,20,55
};
int i;
qsort((void *)arr, LENGTH(arr), sizeof (arr[0]), (int (*)(const void*, const void*))strcmp );
for(i=0;i<10;i++)
printf("%d ",arr[i]);
putchar('\n');
return 0;
}

快速排序,直接找到源代码套用或快排的头文件并调用快排函数


C 语言快速排序最好情况时间复杂度为什么是 nlog2n ?(菜鸟在线)_百度知...
快速排序最好的情况是每次把上一次的数组平均分成两个子数组。设数组总数一共为n,如果把这n个数每次分成2半最后每个数组只包含一个元素,假设要分k次,则2的k次方=n,解得k=log2 n(log以2为底对n取对数).也就是说要分log2 n次,而每次都是处理n个数据。所以总的时间复杂度为O(n*log2...

关于c语言快速排序法的一个疑问 这个是算法的一部分,请问这里找到high小 ...
这个算法应该是快速排序。要了解快排,要了解快排序的两个重要特点,分别是主元pivot和划分。快速排序的思想是随机选择一个pivot。划分的过程就是,将大于和小于pivot的元素分别移动到pivot的两边。我们知道交换两个数的值,若使用第三个变量,则必须申请一个临时空间。而快速排序的划分过程中,在交换记录前...

C语言快速排序问题
include <stdio.h> include <stdlib.h> void XE_Sort(int *s,int low,int high);int Sort(int *t,int low,int high);int main(void){ int m,i,*data;printf("输入排序个数:");scanf("%d",&m);data=(int *)malloc((m+1)*sizeof(int));printf("输入排序元素:");for(i=1;...

C语言快速排序问题程序第11行的j=j--;为什么改成j--就报错
经过测试j=j--相当于j没有作任何运算。你可以单独写一个程序验证一下。如 int j=1;j=j--;printf("%d\\n",j);你会发现输出值为1 至于为什么,我还不清楚。另外,经过我的调试,你把j=j--和对应的i++去掉,这个程序也能输出正确结果。由于测试数据有限,不能保证你的程序是正确的。至于下面...

C语言的快速排序的算法是什么啊?
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有...

C语言排序(冒泡,快速排序和简单选择法排序)问题
其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。include <stdio.h>#include <stdlib.h>#include define MAX 10#define TRAN(x,y) { int t; t=x; x=y; y=t; } void quicksor...

菜鸟提问 c语言关于快速排序
其实,最想说明的是那段交换的代码 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<stdio.h> include<stdlib.h> void quicksort(int R[],int...

...则选用堆排序,若初始记录无序则最好选用快速排序。这是为什么?_百 ...
1,堆排序的性能:时间复杂度总是Nlogn(N) 的。2,快速排序不属于原地排序,由于程序中使用了递归,需要递归调用栈的支持,而栈的长度取决于递归调用的深度。在平均情况下,需要O(logn) 的栈空间;最坏情况下,栈空间可达O(n) 。1 )划分元素的选取是影响时间性能的关键。2 )输入数据次序越乱,...

数据结构(c语言)中快速排序什么时候排序最慢,什么情况下使用快速排序...
当待排序的序列已经有序(不管是升序还是降序),此时快速排序最慢,一般当数据量很大的时候,用快速排序比较好,为了避免原来的序列有序,一般采用改进的快速排序算法,在排序之前随机交换两个元素的位置,就可以达到目的了,有一本书,叫《算法设计、分析与实现:C、C++和java》徐子珊著。可以看看,里面...

用C语言快速排序法编程按从大到小输出下面十个数(24,2,8,32,87,45...
QuickSort(low,Low-1,array); \/*对基准点左边的数再执行快速排序*\/ QuickSort(Low+1,high,array); \/*对基准点右边的数再执行快速排序*\/ } } void main() { int array[]={24,2,8,32,87,45,16,2,12,40};int i=9;QuickSort(0,9,array);for(;i>=0;i--)printf("%d "...

章丘市13977705494: c语言快速排序问题 -
别荆阿乐: #include<stdio.h>int main(){int i,j,f,v,k=0; //k赋值0int d[10000];int n,c[10000];scanf("%d",&n); for(i=0;i<n;i++){scanf("%d",&c[i]);}for(i=0;i<n;i++){ v=c[i]; f=i; for(j=f+1;j<n;j++) //是j++,不是f++ { if(v>c[j]) {d[f]=c[j]; d[j]=v; k++; } }}printf("%d\n",k);}

章丘市13977705494: c语言实现快速排序 -
别荆阿乐: 如果装了VC的运行库源代码就自己看吧. VC\crt\src\qsort.c 有足够的注释了.

章丘市13977705494: 用C语言编快速排序
别荆阿乐: #include<stdio.h> #include<stdlib.h> long a[10000000]; long i,j,k,n; void ks(int i, int j) { int t,l=i,h=j,m;m=a[(i+j)/2];while (i<=j){while (a[i]<m) i=i+1;while (a[j]>m) j=j-1;if (i<=j){ t=a[i]; a[i]=a[j]; a[j]=t; i=i+1; j=j-1;}}if(i<h) ks(i,h);if(l<j) ks(l,j); }main() ...

章丘市13977705494: 用c语言解决快速排序算法,不用递归? -
别荆阿乐: 自己构造一个栈,模拟递归的过程#define push2(A,B) push(B);push(A); void quicksort(a[],l,r) { int i; stackinit();push2(l,r); while(!stackempty()) { l=pop();r=pop(); if(r<=l) continue; i=partition(a,l,r) if(i-1>r-i){push2(l,i-1);push2(i+1,r);} else {pushi2(i+1;r);push2(l,i-1);} } }

章丘市13977705494: C语言的快速排序的算法是什么啊? -
别荆阿乐: 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数...

章丘市13977705494: 用C语言编程实现快速排序算法 -
别荆阿乐: 给个快速排序你参考参考 /********************** 快速排序 **************************** 基本思想:在待排序的n个记录中任取一个记录(通常取第一个记录), 以该记录为基准,将当前的无序区划分为左右两个较小的无 序子区,使左边的记录均小于基...

章丘市13977705494: 用C语言写一个快速排序法,不要用库函数 -
别荆阿乐: include<stdio.h> void main() {int a[]={8,4,24,1,54,87,113,39};//这里的元素可以手动输入,用for循环输入,先给定数组长度N //再一次输入数组元素 /* int n; scanf("&%d",n); for(int =0;i<n;i++)scanf("&%d",&a[i]); */ for(int i=0;i<8;i++){for(int j...

章丘市13977705494: 用C语言编写函数,要实现快速排序算法或者冒泡法 -
别荆阿乐: 冒泡法排序函数如下: void bubble(int a[],int n) {int i,j,t;for(i=0;i<n-1;i++)/*共进行n-1轮*/for(j=0;j<n-1-i;j++)/*每轮在前n-i个数中比较*/if(a[j]>a[j+1]) /*若相邻元素逆序*/ {t=a[j]; a[j]=a[j+1];a[j+1]=t;}/*就交换*/ }void sort(int *a, int left, int right) {if(...

章丘市13977705494: C语言快速排序 程序 求教了 -
别荆阿乐: #include int quick_sort(int a[], int low, int high)//一趟排序找出并确定枢轴位置 { int key = 0; a[0]= a[low]; key = a[low]; while(low{ while(low = key) high--; a[low] = a[high]; while(lowa[high] = a[low]; } a[low] = a[0]; return low; } void qsort(int a[], int low, ...

章丘市13977705494: C语言的快速排序法 -
别荆阿乐: 官方经典快速排序算法 /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网