排序算法—比較排序之冒泡排序及優化

一、冒泡排序

通過比較兩個相鄰的元素來將小的數交換到前面,最後選出最小的數放在最前面;排序步驟就是比較相鄰元素並將較大的往後移。每掃描一輪,將確定一個元素的;

冒泡排序的時間複雜度爲O(n^2);

二、基本算法實現

1.基本函數構建

//構建隨機數組
void builk_art(int* a,int n,int m) {
int i = 0;
for (; i < n; i++) {
*a++ = rand()% m;
}
}
//數據交換
void _swap(int *a,int *b) {
int temp = *a;
*a = *b;
*b = temp;

}

2.冒泡排序C語言實現

//冒泡排序
void bubbke_sort(int *a,int n) {
for (int i = 0; i < n; i++) { //外層循環 
for (int j = n - 1; j >= i+1; j--) {//內層循環
if (a[j] > a[j - 1]) { _swap(&a[j],&a[j - 1]); }//數據向前移動
}
}

}

3.冒泡排序第一層優化—提前終止

//標誌位記錄該次是否發生了交換,如果沒有則退出,排序完成
void bubbke_sort1(int *a, int n) {
int flag = 0;
for (int i = 0; i < n; i++) {
if (flag == 1)break;
for (int j = n - 1; j >= i+1; j--) {
if (a[j] > a[j - 1]) { _swap(&a[j], &a[j - 1]); flag = 0; }
else {flag = 1; }
}
}

}

3.冒泡排序第三層優化

//進一步優化 記錄上一次最後交換的位置 下次交換到該位置即可停止比較
void bubbke_sort2(int *a, int n) {
int i = n;
int flag = i;//記錄上一次交換的位置
while (flag > 0) {
i = flag;//內層循環終止位置
flag = 0;//默認該次循環不交換 即完成排序 若進行了交換則更新
for (int j = 1; j < i; ++j) {
if (a[j] > a[j - 1]) { _swap(&a[j], &a[j - 1]); flag = j; }//記錄本次內層循環最後交換的位置
}
}
}

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