氣泡排序的改進演算法和快速排序
阿新 • • 發佈:2019-02-16
氣泡排序的基本思想
氣泡排序和快速排序的效能分析:
平均情況 最好情況 最壞情況 穩定性
氣泡排序 o(n^2) o(n) o(n^2) 穩定
快速排序 o(n*logn) o(n*logn) o(n^2) 不穩定
.從最好情況來看氣泡排序比快速排序效能更好,也就是說如果你的排序元素基本有序,你應該考慮的就是氣泡排序
.從平均情況來看,快速排序反而優於氣泡排序.
.從根本上來說快速排序就是氣泡排序的一種優化.
首先先給出程式的測試程式碼:
int main() { printf("請輸入5個你要比較的資料:"); for(i=0;i<sz;i++) { scanf("%d",&arr[i]); } quick_sort(arr,0,sz-1); for(i=0;i<sz;i++) { printf("%d ",arr[i]); } system("pause"); return 0; }
.氣泡排序的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序就交換,如果沒有則繼續比較直到比較完成
.在程式中我們用雙重的for迴圈來控制實現,一個變數i控制比較的趟數,一個變數j控制每趟比較的次數
.如果有n個數字需要比較,那仫我們就需要比較(n-1)趟,每一趟我們需要比較(n-1-i)次
.但是如果排序是降序排列,而給出的待排序的元素為 0,9,8,7,6,5,4,3,2,1,我們發現只要將第一個數字交換到陣列末位置就可以了,那仫氣泡排序的每次比較就成為多餘的了,雖然它的比較成立的次數很少,如果我們新增一個標誌位,用來判斷條件是否成立,如果元素本身就是有序的就直接跳出
下面我們就來實現優化之後的氣泡排序
void bubble_sort(int arr[],int sz) { int flag=1; //新增標誌位 for(i=0;i<sz-1;i++) //控制比較的趟數 { flag=1; for(j=0;j<sz-1-i;j++) //控制每趟比較的次數 { if(arr[j] < arr[j+1]) //降序排列 { int tmp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tmp; flag=0; } } if(flag == 1) break; } }
快速排序的基本思想
先選擇一個待排序的元素中的一個做為軸樞(一般選擇第一個元素),通過一趟快速排序將元素分成兩個獨立的部分,一部分均比軸樞小,一部分均比軸樞大,然後分別再對這兩部分進行快速排序,以達到整個有序的目的.
下面我們來看一組元素的快速排序過程.
快速排序的實現:
int Partition(int *arr,int left,int right) //快速排序實現升序排序資料
{
int key=arr[left];
while(left < right)
{
while(left < right && arr[right] >= key) //從元素右面查詢第一個比軸樞小的元素
{
--right;
}
arr[left]=arr[right];
while(left < right && arr[left] <= key) //從元素左面查詢第一個比軸樞大的元素
{
++left;
}
arr[right]=arr[left];
}
return left;
}
void quick_sort(int arr[],int left,int right)
{
int key=0;
if(left < right)
{
key=Partition(arr,left,right); //軸樞key
quick_sort(arr,left,key-1); //位於軸樞左面的數字進行排序
quick_sort(arr,key+1,right); //位於軸樞右面的數字進行排序
}
}
以上就是我個人對氣泡排序和快速排序的理解,如果有不對和需要優化的地方希望大家指出。
看完了記得點評奧