資料結構--演算法時間複雜度
阿新 • • 發佈:2021-08-14
一列數字的排序有兩種方式,一種是氣泡排序,一種是選擇排序
氣泡排序BubbleSort原則:12先比較,然後23比較,然後34比較....(不管是否兩兩交換),因此比較的次數是:數列長度-1,這就是外層迴圈,比了第一輪後,,如果是8,7,2,1。。。呢(這是最糟糕的情況),第一輪交換隻能是比較三次,交換3次,得到7,2,1,8,所以還得進行第二輪比較,依舊是兩兩比較,但做多少次呢?我們看到即使是最大值在第一個位置,做第一輪比較和交換的時候就可以把這個最大值放到他應該在的位置,因此在第二輪比較時就不需要再對整個序列進行比較了,只用比較整個序列長度-1-1次,那麼第n次呢??思考一下,這就是內層迴圈退出的條件~
選擇排序法SelectionSort原則:1跟234。。。。比較(不管是否兩兩交換),因此比較的次數是:數列長度-1,這就是外層迴圈,比了第一輪後,肯定有一個最小值把他置於第一個位置,然後開始第二輪比較,比較的次數不用再帶上第一個位置,因此,比較的起點是第二個位置,因此j=i+1,比較的次數變成序列長度-1-1次,那麼第n次呢??思考一下,這就是內層迴圈退出的條件~
#include <iostream> #include <cassert> using namespace std; void BubbleSort(int *arr,int len);//氣泡排序 voidSelectionSort(int *arr,int len);//選擇排序 int main() { static int a[6]={7,9,56,2,5,0}; int len = sizeof (a)/sizeof (int); // BubbleSort(a,len); // for(int i=0;i<len;i++) // { // printf("%d,",*(a+i)); // } SelectionSort(a,len); for(int i=0;i<len;i++) { printf("%d,",*(a+i)); } } void BubbleSort(int *arr,int len) { //檢測輸入引數 assert(arr!=NULL); //判斷一輪檢測是否有交換 bool change = true; //有交換才繼續排序 for(int i= 0; i < len-1 && change;i++)//int i= len-1; i > 1 && change; --i { change = false; for(int j=0;j<len-1-i; j++) { if(arr[j] > arr[j+1]) { int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; change = true; } } } } //選擇排序 void SelectionSort(int *arr,int len) { //輸入引數檢測 assert(arr!=NULL); //最小值所在值的下標 int min = 0; //len個數,只需要進行len-1次選取就可以了,最後一個就是最大的值 for(int i = 0; i < len - 1; ++i) { //第i個最小值下標 min = i; //選取最小值的下標(前面i個數據已經排好序了) for(int j = i + 1; j < len ; ++j) { if(arr[j] < arr[min]) { //記錄最小值的下標 min = j; } } //交換最小值到位置i if(min != i) { int temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } }