c語言快速排序
㈠ 求助c語言快速排序
voidQuickSort(intA[],intn,intleft,intright)
{/*快速排序(升序),n為數組元素個數,left/right為數組左/右邊界*/
inti,j,t;
if(left<right){/*一趟快速排序*/
i=left+1;
j=right;
while(1){
while(i<=right&&A[i]<=A[left])i++;/*向後搜索,降序>*/
while(j>left&&A[j]>=A[left])j--;/*向前搜索,降序<*/
if(i>=j||i>right||j<=left)break;
t=A[i],A[i]=A[j],A[j]=t;/*交換*/
}
t=A[left];
A[left]=A[j];
A[j]=t;/*交換*/
QuickSort(A,n,left,j-1);/*左半部分遞歸*/
QuickSort(A,n,j+1,right);/*右半部份遞歸*/
}
}
㈡ c語言快速排序
俺博客裡面有啦,參考自己寫的,不好請指教:
http://hi..com/djpangxie/blog/item/572cc9d0ee5546da562c8414.html
㈢ c語言中排序方法
1、冒泡排序(最常用)
冒泡排序是最簡單的排序方法:原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。(注意每一輪都是從a[0]開始比較的)
以從小到大排序為例,第一輪比較後,所有數中最大的那個數就會浮到最右邊;第二輪比較後,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一輪一輪地比較,最後實現從小到大排序。
2、雞尾酒排序
雞尾酒排序又稱雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來回排序或快樂小時排序, 是冒泡排序的一種變形。該演算法與冒泡排序的不同處在於排序時是以雙向在序列中進行排序。
原理:數組中的數字本是無規律的排放,先找到最小的數字,把他放到第一位,然後找到最大的數字放到最後一位。然後再找到第二小的數字放到第二位,再找到第二大的數字放到倒數第二位。以此類推,直到完成排序。
3、選擇排序
思路是設有10個元素a[1]-a[10],將a[1]與a[2]-a[10]比較,若a[1]比a[2]-a[10]都小,則不進行交換。若a[2]-a[10]中有一個以上比a[1]小,則將其中最大的一個與a[1]交換,此時a[1]就存放了10個數中最小的一個。同理,第二輪拿a[2]與a[3]-a[10]比較,a[2]存放a[2]-a[10]中最小的數,以此類推。
4、插入排序
插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素*
一般來說,插入排序都採用in-place在數組上實現。
具體演算法描述如下:
⒈ 從第一個元素開始,該元素可以認為已經被排序
⒉ 取出下一個元素,在已經排序的元素序列中從後向前掃描
⒊ 如果該元素(已排序)大於新元素,將該元素移到下一位置
⒋ 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復步驟2~5
㈣ C語言的快速排序的演算法是什麼啊
快速排序(Quicksort)是對冒泡排序的一種改進。由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。 演算法過程設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用第一個數據)作為關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。 一趟快速排序的演算法是: 1)設置兩個變數I、J,排序開始的時候:I=0,J=N-1; 2)以第一個數組元素作為關鍵數據,賦值給key,即 key=A[0]; 3)從J開始向前搜索,即由後開始向前搜索(J=J-1),找到第一個小於key的值A[J],並與key交換; 4)從I開始向後搜索,即由前開始向後搜索(I=I+1),找到第一個大於key的A[I],與key交換; 5)重復第3、4、5步,直到 I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指針位置不變。另外當i=j這過程一定正好是i+或j-完成的最後另循環結束。) 例如:待排序的數組A的值分別是:(初始關鍵數據:X=49) 注意關鍵X永遠不變,永遠是和X進行比較,無論在什麼位子,最後的目的就是把X放在中間,小的放前面大的放後面。 A[0] A[1] A[2] A[3] A[4] A[5] A[6]: 49 38 65 97 76 13 27 進行第一次交換後:27 38 65 97 76 13 49 ( 按照演算法的第三步從後面開始找) 進行第二次交換後:27 38 49 97 76 13 65 ( 按照演算法的第四步從前面開始找>X的值,65>49,兩者交換,此時:I=3 ) 進行第三次交換後:27 38 13 97 76 49 65 ( 按照演算法的第五步將又一次執行演算法的第三步從後開始找 進行第四次交換後:27 38 13 49 76 97 65 ( 按照演算法的第四步從前面開始找大於X的值,97>49,兩者交換,此時:I=4,J=6 ) 此時再執行第三步的時候就發現I=J,從而結束一趟快速排序,那麼經過一趟快速排序之後的結果是:27 38 13 49 76 97 65,即所有大於49的數全部在49的後面,所有小於49的數全部在49的前面。 快速排序就是遞歸調用此過程——在以49為中點分割這個數據序列,分別對前面一部分和後面一部分進行類似的快速排序,從而完成全部數據序列的快速排序,最後把此數據序列變成一個有序的序列,根據這種思想對於上述數組A的快速排序的全過程如圖6所示: 初始狀態 {49 38 65 97 76 13 27} 進行一次快速排序之後劃分為 {27 38 13} 49 {76 97 65} 分別對前後兩部分進行快速排序 {27 38 13} 經第三步和第四步交換後變成 {13 27 38} 完成排序。 {76 97 65} 經第三步和第四步交換後變成 {65 76 97} 完成排序。
㈤ 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>
#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語言的快速排序法
直接寫快排演算法的話比較吃力,不過網上是有的找的,但要熟練掌握裡面的思想不容易,如果不介意的話,你就去使用C語言自帶的庫函數qsort好了。頭文件是#include<stdlib.h>,具體的介紹網上非常詳細了。
㈧ C語言快速排序
排序快慢得看你提供了多少數據,因為數據量的不同,選擇最快的方法也不同。
㈨ c語言快速排序編寫,求大神
#include<iostream>
using namespace std;
int partition(int *input,int left,int right)
{
int i=left;
int j=right+1;
int value=input[left];
while(i<j)
{
do{
i++;
}while(input[i]<value);
do{
j--;
}while(input[j]>value);
if(i<j)swap(input[i],input[j]);
}
if(i>=j)
{
swap(input[left],input[j]);
return j;
}
}
void quickSort(int *input,int left,int right)
{
if(input==NULL)return;
if(left>=right)return;
int j=partition(input,left,right);
quickSort(input,left,j-1);
quickSort(input,j+1,right);
}
int main()
{
int *input;
int n;
while(true)
{
cin>>n;
if(n==0)break;
input=new int[n];
for(int i=0;i<n;i++)cin>>input[i];
quickSort(input,0,n-1);
for(int i=0;i<n;i++)cout<<input[i]<<" ";
cout<<endl;
}
system("pause");
return 0;
}
㈩ 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;
}