我的編程學習日誌(8)--排序(冒泡,選擇,快速以及sort函數)

關於排序最先學的就是後一個與前一個比較並交換的冒泡排序,記錄下標的選擇排序,這裏就不多介紹了,只把它的代碼貼出來,重點說一下快速排序。

一、冒泡,選擇:

   //冒泡
         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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章