自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

輕松掌握編程基本算法(三)

移動開發(fā) 算法
那么這么多排序算法,到底什么時候用什么樣的算法呢?因為不同的排序方法適應(yīng)不同的應(yīng)用換進和要求,選擇合適的排序方法很重要。

[[121972]]

編程基本算法(一)

編程基本算法(二)

編程基本算法(三) 

選擇排序

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

算法思想:每一趟從待排序的數(shù)據(jù)元素中選出最?。ɑ蜃畲螅┑囊粋€元素,順序放在已排好序的數(shù)列的最后,直到全部待排序的數(shù)據(jù)元素排完。

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

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

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

堆排序

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

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

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

(1)從無序序列建堆。

(2)輸出對頂元素,在調(diào)成一個新堆。

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

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

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

歸并算法

又稱2路歸并算法

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

算法思想:假設(shè)初始序列含有n個記錄,則可看成n個有序的子序列,每個子序列長度為1,然后兩兩歸并,得到[n/2]個長度為2或者為1(這里長度為1可能這里序列長度是奇數(shù),那么最后一個序列就落單了,所以長度為1);在兩兩歸并,如此重復(fù),直至得到一個長度為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.     //用與存放中間分區(qū)域得到的序列 
  4.     int c[10]; 
  5.     void Merge(int c[10],int d[10],int min,int mid,int max); 
  6.     if(min==max)d[min]=b[min]; 
  7.     else 
  8.     { 
  9.         //平分成兩個區(qū)域 
  10.         int mid=(min+max)/2; 
  11.         //將這個區(qū)域進行歸并排序 
  12.         MergeSort(b,c,min,mid); 
  13.         //將這個區(qū)域進行歸并排序 
  14.         MergeSort(b,c,mid+1,max); 
  15.         //兩個區(qū)域歸并 
  16.         Merge(c,d,min,mid,max); 
  17.     } 
  18.  
  19. //將有序序列d[min-mid]與d[mid+1-max]歸并成有序序列c[min-max] 
  20. void Merge(int c[10],int d[10],int min,int mid,int max) 
  21.     int i,j,k; 
  22.     for(i=j=min,k=mid+1;j<=mid&&k<=max;i++) 
  23.     { 
  24.         if(c[j]>c[k]) 
  25.         { 
  26.             d[i]=c[k]; 
  27.             k++; 
  28.         } 
  29.         else 
  30.         { 
  31.             d[i]=c[j]; 
  32.             j++; 
  33.         } 
  34.     } 
  35.     if(j<=mid) 
  36.     { 
  37.         for(;j<=mid;j++,i++) 
  38.         { 
  39.             d[i]=c[j]; 
  40.         } 
  41.     } 
  42.     if(k<=max) 
  43.     { 
  44.          for(;k<=max;k++,i++) 
  45.         { 
  46.             d[i]=c[k]; 
  47.         } 
  48.     } 

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

總結(jié)

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

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

  • 待排序的記錄數(shù)n

  • 對其穩(wěn)定性要求

  • 存儲結(jié)構(gòu)

  • 時間和輔助空間復(fù)雜度

(1)如果n比較?。ɡ鏽<=50),可采用直接插入排序或者簡單選擇排序。

(2)如果序列初始狀態(tài)基本有序,則可選用直接插入排序,冒泡排序。

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

快速排序被認為目前基于比較的內(nèi)部排序中最好的方法。當(dāng)帶排序的關(guān)鍵字隨機分布時,快速排序平均時間最短。 不穩(wěn)定

堆排序所需要的輔助空間小于快速排序,并且不會出現(xiàn)快速排序可能出現(xiàn)的最壞情況。 但還是比較不穩(wěn)定

歸并排序,比較穩(wěn)定,但是歸并排序一般不提倡使用,實用性很差,占用的輔助空間肯能個比較大。

責(zé)任編輯:閆佳明 來源: cnblogs
相關(guān)推薦

2014-10-30 16:12:55

編程技術(shù)算法

2014-10-30 16:34:28

編程技術(shù)算法

2023-07-06 08:31:50

Python對象編程

2023-12-11 18:18:24

Python編程線程

2024-04-10 08:59:39

SpringAOP業(yè)務(wù)

2022-11-06 21:50:59

Python編程函數(shù)定義

2010-01-06 17:51:26

Linux關(guān)機命令

2023-08-04 09:43:16

Socket編程Python

2023-05-10 07:42:26

Java多線程編程

2010-01-04 17:35:32

Silverlight

2009-01-18 15:14:00

數(shù)據(jù)倉庫開發(fā)OLTP

2009-11-12 10:32:47

ADO.NET技術(shù)

2009-12-16 14:26:19

Linux VMwar

2023-09-13 08:00:00

MLOps數(shù)據(jù)科學(xué)

2009-10-12 13:18:55

RHEL 4內(nèi)核

2012-07-17 10:54:49

AJAX

2023-07-28 08:23:05

選擇器Java NIO

2009-12-10 11:02:44

PHP函數(shù)eval()

2009-11-09 15:28:04

WCF知識結(jié)構(gòu)

2009-12-14 11:15:34

Linux chgrp
點贊
收藏

51CTO技術(shù)棧公眾號