成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據庫入門級之算法【三】

數據庫 算法
之前我們跟隨筆者重溫了數據結構中的查詢算法和部分排序算法,現在我們繼續跟隨筆者繼續學習一些基本的排序算法。

之前我們跟隨筆者重溫了數據結構中的查詢算法和部分排序算法,現在我們繼續跟隨筆者繼續學習一些基本的排序算法。

選擇排序

使用條件:可對比大小的集合。

算法思想:每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最后,直到全部待排序的數據元素排完。

舉例編程:int b[10]={77,1,65,13,81,93,10,5,23,17}

  1. //簡單選擇排序  
  2. void SimpleSelect(int b[10])  
  3. {  
  4.     int temp;  
  5.     int i;  
  6.     for(i=0;i<9;i++)  
  7.     {  
  8.         for(int j=i+1;j<9;j++)  
  9.         {  
  10.             if(b[i]>b[j])  
  11.             {  
  12.                 temp=b[i];  
  13.                 b[i]=b[j];  
  14.                 b[j]=temp;  
  15.             }  
  16.         }  
  17.     }  
  18.     cout<<"the sort is:";  
  19.     for(int i=0;i<10;i++)  
  20.     {  
  21.         cout<<b[i]<<" ";  
  22.     }  
  23.     cout<<endl;  
  24. }  

性能分析:時間復雜度為O(n^2)


堆排序

使用條件:可對比大小的集合。

算法思想:其實堆排序是簡單選擇排序的一種進化,它最主要是減少比較的次數。什么是堆?若將序列對應看成一個完全二叉樹,完全二叉樹中所有非終端節點的值均不大于(或者不小于)其左右孩子節點的值,可以稱作為堆。由堆的性質可以知道堆頂是一個最大關鍵字(或者最小關鍵字)。在輸出堆頂后,使剩下的元素又建成一個堆,然后在輸出對頂。如此反復執行,便能得到一個有序序列,這個過程成便是堆排序。

堆排序主要分為兩個步驟:

  1. 從無序序列建堆。
  2. 輸出對頂元素,在調成一個新堆。

舉例編程:int b[10]={77,1,65,13,81,93,10,5,23,17}

  1. //堆排序  
  2. void HeapSort(int b[10])  
  3. {  
  4.     void HeapAdjuest(int b[10],int min,int max);  
  5.     void Sawp(int *a,int *b);  
  6.     int i;  
  7.     //因為是完成二叉樹,所以從最后一個非葉子節點開始堆轉換  
  8.     for(i=9/2;i>=0;i--)  
  9.     {  
  10.         HeapAdjuest(b,i,9);  
  11.     }  
  12.     //拿出堆頂數據在從新堆排序  
  13.     for(i=9;i>0;i--)  
  14.     {  
  15.         Sawp(&b[i],&b[0]);  
  16.         HeapAdjuest(b,0,i-1);  
  17.     }  
  18. }  
  19. //堆調整(大頂堆)  
  20. //min 數據需要調整在數組中的開始位置  
  21. //max 數據需要調整在數據中的結束位置  
  22. void HeapAdjuest(int b[10],int min,int max)  
  23. {  
  24.     if(max<=min)return ;  
  25.     int temp;  
  26.     temp=b[min];  
  27.     int j;  
  28.     //延它的孩子節點循環  
  29.     for(j=2*min;j<=max;j*=2)  
  30.     {  
  31.         //選擇它的大孩子  
  32.         if(j<max&&b[j]<b[j+1])  
  33.         {  
  34.             j++;  
  35.         }  
  36.         //堆頂小于它的孩子不做處理  
  37.         if(temp>b[j])  
  38.         {  
  39.             break;  
  40.         }  
  41.         //將大的數替換成小的數  
  42.         b[min]=b[j];  
  43.         min=j;  
  44.         }  
  45.     b[min]=temp;  
  46. }  
  47. //交換函數  
  48. void Sawp(int *a,int *b)  
  49. {  
  50.     int temp;  
  51.     temp=*a;  
  52.     *a=*b;  
  53.     *b=temp;  
  54. }  

性能分析:時間復雜度時間復雜度O(nlogn)


歸并算法又稱2路歸并算法

使用條件:可對比大小的集合。

算法思想:假設初始序列含有n個記錄,則可看成n個有序的子序列,每個子序列長度為1,然后兩兩歸并,得到[n/2]個長度為2或者為1(這里長度為1可能這里序列長度是奇數,那么最后一個序列就落單了,所以長度為1);在兩兩歸并,如此重復,直至得到一個長度為n的有序序列為止。

舉例編程:int b[10]={77,1,65,13,81,93,10,5,23,17}

  1. //歸并排序  
  2. void MergeSort(int b[10],int d[10],int min,int max)  
  3. {  
  4.     //用與存放中間分區域得到的序列  
  5.     int c[10];  
  6.     void Merge(int c[10],int d[10],int min,int mid,int max);  
  7.     if(min==max)d[min]=b[min];  
  8.     else 
  9.     {  
  10.         //平分成兩個區域  
  11.         int mid=(min+max)/2;  
  12.         //將這個區域進行歸并排序  
  13.         MergeSort(b,c,min,mid);  
  14.         //將這個區域進行歸并排序  
  15.         MergeSort(b,c,mid+1,max);  
  16.         //兩個區域歸并  
  17.         Merge(c,d,min,mid,max);  
  18.     }  
  19. }  
  20. //將有序序列d[min-mid]與d[mid+1-max]歸并成有序序列c[min-max]  
  21. void Merge(int c[10],int d[10],int min,int mid,int max)  
  22. {  
  23.     int i,j,k;  
  24.     for(i=j=min,k=mid+1;j<=mid&&k<=max;i++)  
  25.     {  
  26.         if(c[j]>c[k])  
  27.         {  
  28.             d[i]=c[k];  
  29.             k++;  
  30.         }  
  31.         else 
  32.         {  
  33.             d[i]=c[j];  
  34.             j++;  
  35.         }  
  36.     }  
  37.     if(j<=mid)  
  38.     {  
  39.         for(;j<=mid;j++,i++)  
  40.         {  
  41.             d[i]=c[j];  
  42.         }  
  43.     }  
  44.     if(k<=max)  
  45.     {  
  46.          for(;k<=max;k++,i++)  
  47.         {  
  48.             d[i]=c[k];  
  49.         }  
  50.     }  
  51. }  

性能分析:時間復雜度O(nlogn)

總結

因為不同的排序方法適應不同的應用換進和要求,選擇合適的排序方法考慮以下因素:

  1. 待排序的記錄數n
  2. 對其穩定性要求
  3. 存儲結構
  4. 時間和輔助空間復雜度

那么這么多排序算法,到底什么時候用什么樣的算法呢?

如果n比較小(例如n<=50),可采用直接插入排序或者簡單選擇排序。

如果序列初始狀態基本有序,則可選用直接插入排序,冒泡排序

如果n比價大,則可采用時間復雜度為O(nlogn)的算法:快速排序,堆排序,歸并排序

  1. 快速排序被認為目前基于比較的內部排序中最好的方法。當帶排序的關鍵字隨機分布時,快速排序平均時間最短。 不穩定
  2. 堆排序所需要的輔助空間小于快速排序,并且不會出現快速排序可能出現的最壞情況。 但還是比較不穩定
  3. 歸并排序,比較穩定,但是歸并排序一般不提倡使用,實用性很差,占用的輔助空間肯能個比較大。

 原文鏈接:http://www.cnblogs.com/couhujia/archive/2011/03/25/1994996.html

【編輯推薦】

  1. 初探數據挖掘中的十大經典算法
  2. 當今世界最受人們重視的十大經典算法
  3. 程序員須知之面試時算法題的解答思路
  4. 數據庫入門級之算法【一】
  5. 數據庫入門級之算法【二】
責任編輯:艾婧 來源: 博客園
相關推薦

2011-03-25 09:09:29

算法數據庫

2011-03-25 09:29:03

算法數據庫

2013-05-06 09:14:26

BigQuery大數據分析大數據分析入門

2023-04-14 15:02:55

機器學習算法

2015-11-13 10:06:27

數據科學大數據入門

2021-02-08 12:59:12

Git 控制系統

2010-06-23 10:55:10

FreeBSD入門級命

2010-09-08 12:45:16

2010-09-13 13:58:17

HTML DOM

2016-01-08 13:41:48

戴爾

2025-04-15 10:20:00

FastAPI角色權限系統RBAC

2011-11-02 10:04:07

三星激光打印機

2011-11-23 13:46:46

筆記本評測

2011-08-11 22:09:46

激光打印機推薦

2009-06-30 14:59:36

連接數據庫JSP入門

2018-07-24 09:38:35

JavaMySQLJDBC

2015-07-13 11:20:01

iPhone內存蘋果

2016-03-28 09:54:27

ios開發入門

2017-04-07 10:49:54

NVIDIA入門GTX 1030

2017-05-10 09:26:41

機器學習深度學習
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 大香在线伊779 | 国产精品久久久久久久久久久免费看 | 日日骚av| 久久久久无码国产精品一区 | 欧美性大战久久久久久久蜜臀 | 狠狠影院 | 欧美一区二区三区在线观看 | 国产精品91视频 | 毛片毛片毛片毛片 | 每日在线更新av | ww 255hh 在线观看 | 精品日韩 | 91精品国产91久久久久久不卞 | 欧美极品在线观看 | 91影院| 黄色毛片免费 | 综合精品 | 国产成人精品综合 | 国产精品一区二区三区四区 | 国产激情偷乱视频一区二区三区 | 日本黄色大片免费 | 久久婷婷国产香蕉 | 国产精品欧美一区二区 | 成人深夜福利 | 久久大陆 | 成人欧美一区二区三区黑人孕妇 | 婷婷五月色综合 | 99精品免费久久久久久日本 | h片免费在线观看 | 国产专区在线 | 久久婷婷国产麻豆91 | 91一区二区三区 | 国产精品久久久久久久免费大片 | 最新高清无码专区 | 亚洲国产一区二区在线 | 欧美国产激情二区三区 | 亚洲国产一区二区在线 | 精品国产久 | 波多野结衣亚洲 | 欧美视频在线看 | 欧美日韩视频一区二区 |