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 "...
别荆阿乐: #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...