日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排序算法:冒泡排序算法优化实现及分析

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法:冒泡排序算法优化实现及分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

冒泡排序算法介紹

冒泡排序(Bubble Sort)一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序記錄為止。這是書上的定義,感覺太彎彎腸子了。冒泡排序是幾乎所有學編程的都會學的一個排序,因為其實現思路簡單。實際上就是2 相鄰元素兩兩比較,將最值冒到 最后面去,直到將所有的值都冒泡完畢,排序也就完成了

冒泡排序算法代碼

在有n個元素的 arr數組,第1輪冒泡 將 最值冒到 arr[n-1],第2輪冒泡將最值冒泡到arr[n-2],外層循環完畢,數組元素全部冒泡ok,冒泡排序結束。下面是冒泡排序代碼:

//冒泡排序 //外層循環1次 將一個最值冒出 //直到將所有值 冒出去 void BubbleSort1(int *arr, int length) {for (int i = 0; i < length-1; i++){//冒泡排序是2相鄰元素進行比較,然后冒泡for (int j = 0; j < length - 1 - i; j++){//升序if (arr[j] > arr[j + 1]){Swap(&arr[j], &arr[j + 1]);}}} }


冒泡排序算法優化

比如有個數組{9,1,2,3,4,5,6,7,8}。我們進行升序排序,在第1輪冒排序后,已經排序ok,但是我們的普通冒泡排序,還有進行8輪的內層for循環進行比較 ,這不就是浪費時間浪費青春嘛。所以當我們發現排序已經ok了,就可以不用再排序了。加一個排序是否ok的標志位flag 就行了。比如{9,1,2,3,4,5,6,7,8},在第2輪冒泡排序完畢,我們發現沒有交換數組元素,就知道排序已經ok,就可以結束循環了。下面是優化后的代碼:

//冒泡排序 優化版,添加標志位 //如果內層循環完畢 發現沒有交換值,說明排序已經ok了 void BubbleSort2(int *arr, int length) {int flag = 0;//0 表示沒有排好序for (int i = 0; i < length - 1 && flag == 0; i++){flag = 1;//假定排好序了for (int j = 0; j < length - 1 - i; j++){//升序if (arr[j] > arr[j + 1]){flag = 0;//其實還沒有排好序呢Swap(&arr[j], &arr[j + 1]);}}} }


冒泡排序算法復雜分析

內存循環進行兩兩比較 交換值進行冒泡。在外層

第1輪循環時,arr[0]、arr[1].....arr[n-1],他們兩兩比較 進行冒泡,總共比較次數為n -1,將第一個最值冒泡到arr[n-1] 處。

第2輪循環時,arr[0]、arr[1].....arr[n-2],他們兩兩比較 進行冒泡,總共比較次數為n -2,將第二個最值冒泡到arr[n-2] 處。

所以不難得出它的比較的次數是n-1 + n-2 + n-3 + ....1 = n*(n-1)/2 。

時間復雜度為 = n^2/2- n/2 = n^2 ,O(n^2)

冒泡排序和選擇排序比較

冒泡排序和選擇排序 雖然他們的時間復雜度都是O(n^2),但是由于冒泡排序是進行值的交換,而選擇排序是記錄最值下標 減少了 值交換的次數,所以選擇排序比冒泡排序 效率略微 好一些

完整代碼

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/timeb.h> #define MAXSIZE 20 #define MAXNUM 51 //交換值 void Swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp; } //選擇排序 核心是記錄最值下標 void SelectSort_Up(int *arr, int length) {for (int i = 0; i < length - 1; i++){int index = i;//記錄最值下標for (int j = i + 1; j < length; j++){//升序if (arr[index] > arr[j]){index = j;}}if (i != index){Swap(&arr[i], &arr[index]);}} } //冒泡排序 //外層循環1次 將一個最值冒出 //直到將所有值 冒出去 void BubbleSort1(int *arr, int length) {for (int i = 0; i < length-1; i++){//冒泡排序是2相鄰元素進行比較,然后冒泡for (int j = 0; j < length - 1 - i; j++){//升序if (arr[j] > arr[j + 1]){Swap(&arr[j], &arr[j + 1]);}}} } //冒泡排序 優化版,添加標志位 //如果內層循環完畢 發現沒有交換值,說明排序已經ok了 void BubbleSort2(int *arr, int length) {int flag = 0;//0 表示沒有排好序for (int i = 0; i < length - 1 && flag == 0; i++){flag = 1;//假定排好序了for (int j = 0; j < length - 1 - i; j++){//升序if (arr[j] > arr[j + 1]){flag = 0;//其實還沒有排好序呢Swap(&arr[j], &arr[j + 1]);}}} } //打印數組元素 void PrintArr(int* arr, int length) {for (int i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n");return; } //獲取系統時間 time_t GetSysTime() {struct timeb time;ftime(&time);return time.time * 1000 + time.millitm;; }int main(int argc, char *argv[]) {srand((size_t)time(NULL));//設置隨機種子int arr1[MAXSIZE] = { 0 };int arr2[MAXSIZE] = { 0 };int arr3[MAXSIZE] = { 0 };//給每個元素設置一個隨機值for (int i = 0; i < MAXSIZE; i++){int num = rand() % MAXNUM;arr1[i] = num;arr2[i] = num;arr3[i] = num;}printf("冒泡排序前:\n");PrintArr(arr1, MAXSIZE);printf("普通版冒泡升序:\n");BubbleSort1(arr1, MAXSIZE);PrintArr(arr1, MAXSIZE);printf("冒泡排序前:\n");PrintArr(arr2, MAXSIZE);printf("優化版冒泡升序:\n");long start1 = GetSysTime();BubbleSort2(arr2, MAXSIZE);long end1 = GetSysTime();PrintArr(arr2, MAXSIZE);/*printf("選擇排序前:\n");PrintArr(arr2, MAXSIZE);printf("選擇排序升序:\n");long start2 = GetSysTime();BubbleSort2(arr2, MAXSIZE);long end2 = GetSysTime();PrintArr(arr2, MAXSIZE);printf("%d個元素選擇排序耗費時間:%d\n",MAXSIZE,end1-start1);printf("%d個元素冒泡排序耗費時間:%d\n", MAXSIZE, end1 - start1);*/return 0; }

代碼運行檢測

普通冒泡和優化的冒泡排序


選擇排序和冒泡排序比較,用10000個元素測試,就不打印了。差距很明顯喲。



總結

以上是生活随笔為你收集整理的排序算法:冒泡排序算法优化实现及分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。