C 實現幾種排序演算法

2021-09-26 05:35:03 字數 1476 閱讀 6346

概念:氣泡排序的大概思想是兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序為止

1.普通冒泡法:

void bubblesort(vector&vi)

}

}

}

2.優化冒泡法,增加標誌位,對已經有序的序列不在進行比較

void bubblesort2(vector&vi)}}

}

概念:通過n-i次關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i個記錄交換。其特點就是減少了交換移動資料的次數,相應的節約了運算時間。分析它的時間複雜度可以看出,無論最好還是最差的情況,其比較次數相同;而交換次數,最好的時候為0,最壞為n-1次。總的時間複雜程式是o,但效能上還是略優於冒泡法。

void selectsort(vector&vi)

if(i != min) //min不等於i說明min是最小值,否則沒必要交換

}}

概念:通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入 ,如此重複,直至完成序列排序。 

演算法分析: 

1. 從序列第乙個元素開始,該元素可以認為已經被排序 

2. 取出下乙個元素,設為待插入元素,在已經排序的元素序列中從後向前掃瞄,如果該元素(已排序)大於待插入元素,將該元素移到下一位置。 

3. 重複步驟2,直到找到已排序的元素小於或者等於待排序元素的位置,插入元素 

4. 重複2,3步驟,完成排序。

**直插排序的時間複雜度同樣為o(n²),但效能上比冒泡和簡單排序要好一些

void insertsort(vector&vi)

概念:快排在我們日常工作中經常遇到,在面試中也會偶爾出現要你手寫快排的時候,因此掌握他是非常重要的。快排的本質上來講可以理解為前面的氣泡排序公升級版。他利用了二分法的思維,通過一趟排序將待排資料分割成了兩邊,其中一邊的資料均比另外一邊的資料小,通過遞迴呼叫的方法迴圈分割最終達到資料有序的目的。

快排的時間複雜度最優為o(nlogn),最差為o(n²);

普通快排:

int partition(vector&vi,int low, int high)

}void quicksort(vector&vi)

優化快排:

1、將樞軸的取法修改為三數取中間數(頭、中、尾三數取中間數),盡量保證樞軸靠近資料中間。

2、參考簡單選擇排序,優化不必要的交換,將交換放在最後

void swap(vector&vi,int low, int high)

int partition1(vector&vi,int low, int high)

vi[low] = temp;

return low;

}

幾種排序演算法的C 實現

插入排序 include define max size 1000 using namespace std 插入排序,pa為指向陣列的指標,n為陣列元素個數 void insert sort int pa,int n pa i key int main else free p1 free p2 合併...

幾種排序演算法的C 實現

這兩天學習幾種常見的排序演算法,對照書本和一些部落格自己實現了一遍,貼在這裡當個備份,供以後複習。include using namespace std void printa int a,int len,int i 插入排序 直接插入排序 straight insertion sort void ...

幾種排序演算法實現

class sort include sort.h include sort sort void sort sort void 交換兩個數 inline void sort swap int a,int b 氣泡排序 1.比較相鄰的前後兩個資料,如果前面的資料大於後面的資料,就將兩個資料交換。2.這...