各種排序演算法總結(未完結)

2021-10-02 16:19:49 字數 2591 閱讀 4275

假設有n個元素,氣泡排序思想是從前往後將相鄰的兩個元素進行比較,如果前者大於後者,交換兩者位置;如果前者小於後者,則不進行任何操作。這樣一次迴圈將最大的乙個數放在最後面,下次迴圈只需對前n-1個元素進行排序,迴圈結束將第二大的數排在倒數第二,依次類推,將n個元素完成排序。

氣泡排序第一次迴圈需要比較n-1次,第二次迴圈比較n-2次…

總共比較的次數為(n-1)+(n-2)+…+1次=n*(n-1)/2次,演算法的時間複雜度為o(n²)。

#include

"stdio.h"

#define n 10

intmain()

;//待排序的n個元素

int b;

//用於兩個變數交換的中間變數

int judgecount =

0, swapcount =0;

//對判斷次數和交換次數進行計數

for(i =

0; i < n-

1; i++

)//第一次進行n-1次兩兩比較,之後每次比較次數-1

judgecount++

;//判斷次數+1}}

for(i =

0; i <

10; i++

)//列印輸出排序結果

printf

("\n氣泡排序共進行了%d次判斷,%d次交換\n"

, judgecount, swapcount)

;}

氣泡排序執行結果:

假設有n個元素,選擇排序思想是先從n個元素中找到最小元素,將其與第乙個元素交換。然後從後n-1個元素中找到最小元素,將其與第二個元素交換,依次類推直到完成排序。

選擇排序第一次迴圈需要比較n-1次,第二次迴圈比較n-2次…

總共比較的次數為(n-1)+(n-2)+…+1次=n*(n-1)/2次,與氣泡排序一樣。但選擇排序在尋找最小元素時可以先把最小元素的下標記錄下來,等本次迴圈結束後再進行交換,減少了交換次數。選擇演算法的時間複雜度同樣為o(n²)。

#include

"stdio.h"

#define n 10

intmain()

;//待排序的n個變數

int b,k;

//b是用於交換的中間變數,k用於儲存最小元素的下標

int judgecount =

0, swapcount =0;

//對判斷次數和交換次數進行計數

for(i =

0; i < n-

1; i++

)//第一次進行n-1次比較,之後每次比較次數-1

judgecount++

;//判斷次數+1}if

(i != k)

//如果i=k,則a[i]與a[k]是同乙個元素,不需要交換

}for

(i =

0; i < n; i++

)//列印輸出排序結果

printf

("\n");

printf

("選擇排序共進行了%d次判斷,%d次交換\n"

, judgecount, swapcount)

;}

選擇排序執行結果:

從執行結果來看氣泡排序與選擇排序判斷次數一樣,但選擇排序交換次數要少於氣泡排序。

假設有n個元素,插入排序思想是將n個元素分為有序部分和無序部分。從無序部分中取出元素插入到有序部分的合適處。

首先將第乙個元素定為有序部分,之後n-1個元素為無序部分。取無序部分第乙個元素,將其與有序部分的元素從後至前乙個乙個進行比較。如果大於該元素,則繼續選擇前乙個元素比較,直到小於該元素或沒有元素可比較,將其插入在該元素前面。隨著排序的進行,有序部分元素越來越多,無序部分元素越來越少,直到全部轉變為有序部分,完成排序。插入排序演算法的時間複雜度為o(n²),但相對於氣泡排序和選擇排序減少了判斷次數。

#include

"stdio.h"

#define n 10

intmain()

;//待排序的n個元素

int b,c;

int judgecount =

0, swapcount =0;

//統計判斷次數,交換次數

for(i =

1; i < n; i++

)//無序部分的元素,迴圈一次減少乙個

if(c != i)

//如果c=i,則b=a[c],不需要進行交換

}for

(i =

0; i < n; i++

)//列印輸出排序結果

printf

("\n共進行了%d次判斷,%d次交換\n"

, judgecount, swapcount)

;}

插入排序執行結果:

快速排序(未完結)

正常的選擇 氣泡排序,時間複雜度為o nn 快速排序 平均為 o n log n 最壞 o nn 就是將陣列按照 其中的乙個元素 基準值 進行分割,分割為兩個部分 大於基準值和小於基準值 因為此時第一次排完序只是將陣列分割,而被分割的部分並不一定是從小到大排序,所以需要下一次的對兩個分割部分在進行各...

Spring總結(未完結)

1.什麼是spring 是乙個輕量級 實現了控制反轉 提供了面向切面的容器框架 spring提供對持久層以及對事務的支援 spring提供mvc web框架的實現,並對一些常用的企業服務api提供一致的模型封裝 spring提供與主流框架的整合方案 2.什麼是依賴注入?什麼是控制反轉?依賴注入 元件...

積累(未完結)

1.輸出字元寬度 include include using namespace std intmain 2.精確到小數點後幾位 include include using namespace std intmain 3.不同資料型別儲存空間大小 include using namespace st...