快速排序c語言
//一點小問題而已,已為你改好
#include <stdio.h>
void Quick_sort (int s[], int l, int r )
{
if(l<r)
{
int i=l,j=r,x=s[l];
while(i<j)
{
while(i<j&&s[j]>=x)
{j--;}//從右向左找第一個小於x的數
if(i<j)
{s[i++]=s[j];}
while(i<j&&s[i]<=x)
{i++;}//從左到右找第一個大於等於x的數
if(i<j)
{s[j--]=s[i];}
}
s[i]=x;
Quick_sort(s,l,i-1);//遞歸
Quick_sort(s,i+1,r);
}
}
int main()
{
int arr[7] = { 1,9,7,6,5,35,15 };
int i;
printf("之前的數組:");
for (i = 0; i < 7; i++) printf("%3d", arr[i]);
printf("\n");
Quick_sort(arr, 0, 6);
printf("排序之後的數組:");
for (i = 0; i < 7; i++) printf("%3d", arr[i]);
printf("\n");
return 0;
}
『貳』 C語言,快速排序演算法
0和N-1表示的是數組下標。快排每一趟排序的目的是使值比設定的key值小的數都排到數組前部分,大的都排到後部分;然後對這兩部分用新的關鍵值key分別重復上一步的操作;遞歸,直到數組有序。
其中關鍵值key=a[low]。
用題目給定的數組模擬第一趟排序如下:
下標0123456789
值91647824661232551
low=0high=9
part_element=a[low]=9
進入for循環
進入第一個while
part_element<51,於是high--,high=8;
part_element<25,high--,high=7;
part_element>3,不滿足,結束while
a[low]=a[0]=a[high]=a[7]=3,low++,low=1;
進入第二個while
part_element<16,不滿足,結束while
a[high]=a[7]=a[low]=a[1]=16,high--,high=6
for第一個循環結束,數組如下
316478246612162551
low=1,high=6
for第二個循環同上,結束時數組如下
344782476612162551
low=2,high=3
for第三個循環,第一個while中high--以後,low==high,直接break跳出for循環,此時
344782476612162551
low=2,high=2
結束for以後
a[high]=a[2]=part_element=9,得到
34982476612162551
split函數returnhigh=2
quicksort函數中middle=2;
下面兩句遞歸,仍然是調用split函數,對數組
0-2,3-9兩部分分別重復上述操作
最後直到數組數據有序
『叄』 快速排序。c語言
#include<stdio.h>
#include<malloc.h>
voidchange(int*a,int*b)
{
intt=*a;
*a=*b;
*b=t;
}
voidqsort(int*a,intn)
{
if(n>1){
inti=0,j=n-1,t=0;
for(;i<j;)
{
while(a[t]<=a[j])j--;
if(j<0)break;
change(a+t,a+j);
t=j;
while(a[t]>=a[i])i++;
if(i>=n)break;
change(a+t,a+i);
t=i;
}
qsort(a,i-1);
qsort(a+i+1,n-i-1);
}
}
intmain(void)
{
int*a;
intt,n,i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
a=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
scanf("%d",a+i);
qsort(a,n);
for(i=0;i<n;i++)
printf("%d",a[i]);
free(a);
}
return0;
}
『肆』 C語言 快速排序
這個程序很糟糕,void qsort(long,long); 不知道是聲明還是調用,聲明就應該寫再main前面(void qsort(long s1,long s2); ),調用就應該寫成調用的形式(qsort(s1,s2); )而且你的調用沒有傳值過去,
還有a[i]中i不可能是long型,
if (s1<j) qsort(s1,i);
if (s2>i) qsort(i,s2);
其實就是排第一遍之後再進行第二遍排序,直到排序完成。
『伍』 c語言,快速排序怎麼寫
#include<stdio.h>
voidswap(int*a,int*b){
intt=*a;
*a=*b;
*b=t;
return;
}
intpartition(inta[],intstart,intend){
intx=a[end];
inti=start-1;
intj;
for(j=start;j<=end-1;j++){
if(a[j]<=x){
i+=1;
swap(a+i,a+j);
}
}
swap(a+i+1,a+end);
returni+1;
}
voidqsort(inta[],intstart,intend){
if(start>=end)return;
intp=partition(a,start,end);
qsort(a,start,p-1);
qsort(a,p+1,end);
}
voidprint(inta[],intstart,intend){
inti;
for(i=start;i<=end;i++)
printf("%d",a[i]);
printf(" ");
return;
}
intmain(void){
inta[5]={1,1,2,2,3};
inti;
qsort(a,0,4);
print(a,0,4);
printf("Pleaseinput5numbers: ");
while(1){
for(i=0;i<=4;i++)
scanf("%d",a+i);
qsort(a,0,4);
print(a,0,4);
}
return0;
}
『陸』 用C語言編程實現快速排序演算法
給個快速排序你參考參考
/**********************快速排序****************************
基本思想:在待排序的n個記錄中任取一個記錄(通常取第一個記錄),
以該記錄為基準,將當前的無序區劃分為左右兩個較小的無
序子區,使左邊的記錄均小於基準值,右邊的記錄均大於或
等於基準值,基準值位於兩個無序區的中間位置(即該記錄
最終的排序位置)。之後,分別對兩個無序區進行上述的劃
分過程,直到無序區所有記錄都排序完畢。
*************************************************************/
/*************************************************************
函數名稱:staticvoidswap(int*a,int*b)
參數:int*a---整型指針
int*b---整型指針
功能:交換兩個整數的位置
返回值:無
說明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
staticvoidswap(int*a,int*b)
{
inttemp=*a;
*a=*b;
*b=temp;
}
intquickSortNum=0;//快速排序演算法所需的趟數
/*************************************************************
函數名稱:staticintpartition(inta[],intlow,inthigh)
參數:inta[]---待排序的數據
intlow---無序區的下限值
inthigh---無序區的上限值
功能:完成一趟快速排序
返回值:基準值的最終排序位置
說明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
staticintpartition(inta[],intlow,inthigh)
{
intprivotKey=a[low];//基準元素
while(low<high)
{//從表的兩端交替地向中間掃描
while(low<high&&a[high]>=privotKey)//找到第一個小於privotKey的值
high--;//從high所指位置向前搜索,至多到low+1位置
swap(&a[low],&a[high]);//將比基準元素小的交換到低端
while(low<high&&a[low]<=privotKey)//找到第一個大於privotKey的值
low++;//從low所指位置向後搜索,至多到high-1位置
swap(&a[low],&a[high]);//將比基準元素大的交換到高端
}
quickSortNum++;//快速排序趟數加1
returnlow;//返回基準值所在的位置
}
/*************************************************************
函數名稱:voidQuickSort(inta[],intlow,inthigh)
參數:inta[]---待排序的數據
intlow---無序區的下限值
inthigh---無序區的上限值
功能:完成快速排序演算法,並將排序完成的數據存放在數組a中
返回值:無
說明:使用遞歸方式完成
**************************************************************/
voidQuickSort(inta[],intlow,inthigh)
{
if(low<high)
{
intprivotLoc=partition(a,low,high);//將表一分為二
QuickSort(a,low,privotLoc-1);//遞歸對低子表遞歸排序
QuickSort(a,privotLoc+1,high);//遞歸對高子表遞歸排序
}
}
『柒』 c語言快速排序
俺博客裡面有啦,參考自己寫的,不好請指教:
http://hi..com/djpangxie/blog/item/572cc9d0ee5546da562c8414.html
『捌』 C語言的快速排序法
直接寫快排演算法的話比較吃力,不過網上是有的找的,但要熟練掌握裡面的思想不容易,如果不介意的話,你就去使用C語言自帶的庫函數qsort好了。頭文件是#include<stdlib.h>,具體的介紹網上非常詳細了。
『玖』 C語言快速排序
排序快慢得看你提供了多少數據,因為數據量的不同,選擇最快的方法也不同。
『拾』 快速排序 c語言
你的split函數應該錯了,你改成別的就能正常