關於排序最先學的就是後一個與前一個比較並交換的冒泡排序,記錄下標的選擇排序,這裏就不多介紹了,只把它的代碼貼出來,重點說一下快速排序。
一、冒泡,選擇:
//冒泡
for(i=0;i<8;i++)
for(j=0;j<8-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
//選擇
for(i=0;i<8;i++)
for(j=i;j<8-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
二、快速排序
(用c++的同學如果實在看不懂就不要看了,直接看 三。用純c的話,你必須看懂)
既然叫快速排序,說明他是速度最快的。
快速排序首先選一個數組中的值作爲參照,比他小的放在他的左邊,大的放在右邊。
然後對左半部分,同樣選一個參照,比他小的放在他的左邊,大的放在右邊。
若此時左半部分的左邊只有一個數,就對左半部分的右邊做同樣的操作。否則再對其(左半部分的左邊)左邊做同樣操作。
左半部分完成後,對右半部分做和左半部分一樣的操作。
具體過程如下:
一般選a[0]作爲參照,假設數組爲a[5],從小到大排
key=a[o];n=0;m=4;
① 然後把a[m]和key比較,如果a[m]<key就a[n]=a[m],
如果a[m]>=key,就m--,一直循環到a[m]<key或者m<n時結束循環。
(當然,若到循環結束也沒找到一個a[m]大於key就說明數組是已經排好序的了。)
② 接下來把a[n]和key比較,如果a[n]>key就a[m]=a[n],如果a[n]<=key,就n++,一直循環到a[n]>key或者m<n時結束循環。
③ 接着把key放到a[n],此時a[n]左邊一定比他小,右邊比他大。
④ 然後對a[n]左邊重複1,2,3步。
⑤ 然後對a[n]右邊重複1,2,3步。
實現時,4,5步用一個遞歸就行。
代碼如下:
void quick(int*a,int i,int j)
{
int n,m,key;
key=a[i];
n=i;
m=j;
while(n<m)
{
while(a[m]>key&&m>n)
{m--;}
a[n]=a[m];
while(a[n]<key&&n<m)
{n++;}
a[m]=a[n];
}
a[n]=key;
if(n>i) quick(a,i,n-1);
if(n<j) quick(a,n+1,j);
}
int main()
{
int a[5]={7,6,10,5,67};
quick(a,0,5-1);
return 0;
}
三、sort()函數
sort()函數在c++的頭文件algorithm中
用法是sort(begin,end,排序規則)
sort()函數是用快速法排序,在不寫排序規則的情況下,默認從小到大排序
代碼如下:
#include<stdio.h>
#include<iostream>
#include<algorithm>
usingnamespace std;
intmain()
{
int a[5]={7,6,10,5,67};
sort(a,a+5);
for(int i=0;i<5;i++)
printf("%d ",a[i]);
return 0;
}
(如果寫成sort(a+1,a+4),表示對a[1]-a[3]排序)
那麼,從大到小該如何做呢?
#include<stdio.h>
#include<iostream>
#include<algorithm>
usingnamespace std;
boolcompare(int a,int b)
{returna>b;}
intmain()
{
int a[5]={7,6,10,5,67};
sort(a,a+5,compare);
for(int i=0;i<5;i++)
printf("%d ",a[i]);
return 0;
}
我們還可以用頭文件functional裏提供的函數
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<functional>
usingnamespace std;
intmain()
{
int a[5]={7,6,10,5,67};
sort(a,a+5,greater<int>());//從大到小
sort(a,a+5,less<int>());//從小到大
return 0;
}