久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

漫談經(jīng)典排序算法:三,、冒泡排序 && 快速排序

 Dlfming 2017-01-15
1、序言 

這是《漫談經(jīng)典排序算法系列》第三篇,,先解析了冒泡排序,,然后引出快速排序,給出了快速排序的兩種實現(xiàn)版本,。 

各種排序算法的解析請參考如下: 

《漫談經(jīng)典排序算法:一,、從簡單選擇排序到堆排序的深度解析》

《漫談經(jīng)典排序算法:二、各種插入排序解析及性能比較》

《漫談經(jīng)典排序算法:三,、冒泡排序 && 快速排序》

《漫談經(jīng)典排序算法:四,、歸并排序》

《漫談經(jīng)典排序算法:五、線性時間排序(計數(shù),、基數(shù),、桶排序)》

《漫談經(jīng)典排序算法:六、各種排序算法總結(jié)》

注:為了敘述方便,,本文以及源代碼中均不考慮A[0],默認(rèn)下標(biāo)從1開始,。 

2,、冒泡排序 
  2.1 引出

前面的兩篇博客里講的插入排序是基于“逐個記錄插入”,,選擇排序是基于“選擇”,那么冒泡排序其實是基于“交換”,。每次從第一個記錄開始,,一、二兩個記錄比較,,大的往后放,,二三兩個記錄比較...依次類推,這就是一趟冒泡排序。每一趟冒泡排序后,,無序序列中值最大的記錄冒到序列末尾,,所以稱之為冒泡排序。 

  2.2 代碼
//冒泡排序 
void bubbleSort(int *a,int n) 

 int i,j; 
 for(i=1;i for(j=1;j if(a[j+1] a[j]=a[j]+a[j+1]; 
 a[j+1]=a[j]-a[j+1]; 
 a[j]=a[j]-a[j+1]; 
 } 
 } 

  2.3 效率分析

相對于簡單選擇排序,,冒泡排序交換次數(shù)明顯更多,。它是通過不斷地交換把最大的數(shù)冒出來。冒泡排序平均時間和最壞情況下(逆序)時間為o(n^2),。最佳情況下雖然不用交換,,但比較的次數(shù)沒有減少,時間復(fù)雜度仍為o(n^2),。此外冒泡排序是穩(wěn)定的,。 

3、快速排序 
  3.1 引出

快速排序是冒泡排序的一種改進(jìn),,冒泡排序排完一趟是最大值冒出來了,,那么可不可以先選定一個值,然后掃描待排序序列,,把小于該值的記錄和大于該值的記錄分成兩個單獨的序列,,然后分別對這兩個序列進(jìn)行上述操作。這就是快速排序,,我們把選定的那個值稱為樞紐值,,如果樞紐值為序列中的最大值,那么一趟快速排序就變成了一趟冒泡排序,。 

  3.2 代碼

兩種版本,,第一種是參考《數(shù)據(jù)結(jié)構(gòu)》,在網(wǎng)上這種寫法很流行,。第二種是參考《算法導(dǎo)論》,,實現(xiàn)起來較復(fù)雜。 

//快速排序(兩端交替著向中間掃描) 
void quickSort1(int *a,int low,int high) 

 int pivotkey=a[low];//以a[low]為樞紐值 
 int i=low,j=high; 
 if(low>=high) 
 return; 
 //一趟快速排序 
 while(i while(i < j && a[j] >= pivotkey) 
 j--; 
 a[i]=a[j]; 
 while(i < j && a[i] <= pivotkey) 
 i++; 
 a[j]=a[i]; 
 } 
 a[i]=pivotkey;//放置樞紐值 
 //分別對左邊,、右邊排序 
  quickSort1(a,low,i-1);
 quickSort1(a,i+1,high); 

//快速排序(以最后一個記錄的值為樞紐值,,單向掃描數(shù)組) 
void quickSort2(int *a,int low,int high) 

 int pivotkey=a[high];//以a[high]為樞紐值 
  int i=low-1,temp,j;
 if(low>=high) 
 return; 
 //一趟快速排序 
 for(j=low;j if(a[j]<=pivotkey){ 
 i++; 
  temp=a[i];
 a[i]=a[j]; 
 a[j]=temp; 
 } 
 } 
 i++; 
 //放置樞紐值 
 temp=a[i]; 
 a[i]=pivotkey; 
 a[high]=temp; 
 //分別對左邊、右邊排序 
  quickSort2(a,low,i-1);
 quickSort2(a,i+1,high); 
}
  3.3 效率分析

  快速排序時間與劃分是否對稱有關(guān),??焖倥判虻钠骄鶗r間復(fù)雜度為o(n*logn),至于為什么是o(n*logn),,請參考《算法導(dǎo)論》第7章,,書中用遞歸樹的方法闡述了快速排序平均時間。且常數(shù)因子很小,,所以就平均時間而言,,快速排序是很好的內(nèi)部排序方法,。最佳情況下(每次劃分都對稱)時間復(fù)雜度o(n*logn)。最壞情況下(每次劃分都不對稱,,如輸入的序列有序或者逆序時)時間復(fù)雜度為o(n^2),,所以在待排序序列有序或逆序時不宜選用快速排序。此外,,快速排序是不穩(wěn)定的,。 

  最佳情況下,每次劃分都是對稱的,,由于樞紐值不再考慮,,所以得到的兩個子問題的大小不可能大于n/2,同時一趟快速排序時間為o(n),,所以運行時間遞歸表達(dá)式:

T(n)<=2T(n/2)+o(n),。這個遞歸式的解法請參考下一篇博客中歸并排序效率分析。其解為T(n)=o(n*logn),。 

  最壞情況下,,每次劃分都很不對稱,T(n)=T(n-1)+o(n),可以用遞歸樹來解,,第i層的代價為n-i+1.總共有n層,。把每一層代價加起來有n-1個n相加。所以這個遞歸式的解為T(n)=o(n^2),此時就是冒泡排序,。 

4,、附錄 
  4.1 參考書籍

《數(shù)據(jù)結(jié)構(gòu)》嚴(yán)蔚敏版                    《算法導(dǎo)論》 

  4.2 所有源代碼
#include 
//冒泡排序 
void bubbleSort(int *a,int n) 

 int i,j; 
 for(i=1;i for(j=1;j if(a[j+1] a[j]=a[j]+a[j+1]; 
 a[j+1]=a[j]-a[j+1]; 
 a[j]=a[j]-a[j+1]; 
 } 
 } 

void main() 

 int i; 
 int a[7]={0,3,5,8,9,1,2};//不考慮a[0] 
 bubbleSort(a,6); 
 for(i=1;i<=6;i++) 
 printf('%-4d',a[i]); 
 printf('\n'); 

#include 
//快速排序(兩端交替著向中間掃描) 
void quickSort1(int *a,int low,int high) 

 int pivotkey=a[low];//以a[low]為樞紐值 
 int i=low,j=high; 
 if(low>=high) 
 return; 
 //一趟快速排序 
 while(i while(i < j && a[j] >= pivotkey) 
 j--; 
 a[i]=a[j]; 
 while(i < j && a[i] <= pivotkey) 
 i++; 
 a[j]=a[i]; 
 } 
 a[i]=pivotkey;//放置樞紐值 
 //分別對左邊、右邊排序 
  quickSort1(a,low,i-1);
 quickSort1(a,i+1,high); 

//快速排序(以最后一個記錄的值為樞紐值,,單向掃描數(shù)組) 
void quickSort2(int *a,int low,int high) 

 int pivotkey=a[high];//以a[high]為樞紐值 
  int i=low-1,temp,j;
 if(low>=high) 
 return; 
 //一趟快速排序 
 for(j=low;j if(a[j]<=pivotkey){ 
 i++; 
  temp=a[i];
 a[i]=a[j]; 
 a[j]=temp; 
 } 
 } 
 i++; 
 //放置樞紐值 
 temp=a[i]; 
 a[i]=pivotkey; 
 a[high]=temp; 
 //分別對左邊,、右邊排序 
  quickSort2(a,low,i-1);
 quickSort2(a,i+1,high); 

void main() 

 int i; 
 int a[7]={0,3,5,8,9,1,2};//不考慮a[0] 
 quickSort2(a,1,6); 
 quickSort1(a,1,6); 
 for(i=1;i<=6;i++) 
 printf('%-4d',a[i]); 
 printf('\n'); 
}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多