常見排序演算法總結

2021-06-07 18:41:28 字數 2964 閱讀 1836

// sort.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

const int len = 100;

class csort

;//注意此處應該有分號

csort::csort():length(len) //建構函式,初始化陣列

arr[j+1] = key;}}

}//折半插入排序

class cbinsertsort : public csort;/*

折半插入排序:

與直接插入排序所不同的是,在有序序列中找到當前元素的正確位置時

採用折半查詢的方式,而不是挨個兒比較。

時間複雜度:o(n*logn)

*/void cbinsertsort::sort()

else

} //找到插入位置high+1後,移位

/*for (j=i-1;j>=high+1;j--)

arr[high+1] = key;*/

//找到插入位置low後,移位

for (j=i-1;j>=low;j--)

arr[low] = key;

}}//希爾排序

class cshellinsertsort : public csort

;/**

希爾排序:

又稱縮小增量的插入排序。

增量一定的時候,將直接插入排序中的1改為增量inc即可。

相比直接插入排序好處在哪?

時間複雜度:o(n^1.3)

*/void cshellinsertsort::sort()

;//增量

for (int i=0; i<3; i++)

}void cshellinsertsort::shellinsert(int inc)//希爾排序,將直接插入排序中的1改為增量inc即可

arr[j+inc] = key;}}

}//氣泡排序

class cbubblesort : public csort

;/**

氣泡排序:

比較長度減1趟,每趟都是從第乙個元素開始依次比較,如果前者比後者大,則交換位置

每趟找到乙個正確的位置,最大值、次大值。。。

時間複雜度:o(n^2) 最好情況為:o(n)

*/void cbubblesort::sort()}}

}//快速排序

class cfastsort : public csort

;/**

快速排序:

初始狀態將第乙個元素作為樞軸元素,進行一次劃分,找到它的確定位置

左半部分的元素都比樞軸元素小,右半部分的元素都比樞軸元素大

然後分別遞迴的對左右兩部分的元素進行快速排序。

*/void cfastsort::sort()

/**找到樞軸元素的位置,對陣列進行劃分。

設定兩個游標:low,high.如果游標high對應的元素大於或等於樞軸元素,則游標high減1;否則將該值賦洞口

如果游標low對應的元素小於或等於樞軸元素,則游標low加1;否則將該值賦給洞口

當low=high時迴圈結束,它們所指示的位置就是樞軸元素所在的位置。

時間複雜度:o(n*logn) 最壞情況:o(n^2)

*/int cfastsort::partition(int low, int high)

arr[low] = arr[high];//找到第乙個比key小的元素

while (low < high && arr[low] <= key)

arr[high] = arr[low];//找到第乙個比key大的元素

}arr[low] = key;

return low;

}void cfastsort::fastsort(int low, int high)

}//堆排序 從小到大 初始堆為大根堆

class cheapsort : public csort

;void cheapsort::sort() //實現父類的虛函式

/**堆排序:

初始狀態按照完全二叉樹的結構依次排列形成乙個初始堆。然後從第乙個非終端節點開始到根結點

依次調整以該結點為根的子樹,形成乙個大根堆。之後將堆頂元素和最後乙個元素交換,輸出堆頂元素。

接著調整新形成的堆,注意這時是直接從根結點開始調整堆的。然後將堆頂元素和最後乙個元素交換。。。

其中有個很重要的調整堆的操作。整個排序的過程,實際上是在陣列中進行的。

時間複雜度:o(n*logn)

*/void cheapsort::heapsort()

for (int j=length-1; j>0; j--)

}/**

調整堆的過程:

有兩個引數:s表示待調整的位置下標,w表示待排序的元素個數

區域性變數i表示的是最大值的下標

用key記錄待調整的元素,比較時是從它的左孩子開始的,

注意要判斷待調整的元素是否有兩個孩子。如果它比孩子大,則不需要調整

否則將較大的孩子的值賦給待調整的元素。s變為該孩子的下標,繼續比較。

最後找到待調整元素的正確位置。調整結束

*/void cheapsort::adjustheap(int s,int w)

arr[s]=arr[i];

s=i;

}arr[s]=key;

}//選擇排序

class cselectionsort : public csort;/*

選擇排序:

比較長度減1次,每次找到乙個最小值,和未排序序列中的第乙個元素(即i所記錄的)進行交換

用乙個下標記錄最小值的下標

時間複雜度:o(n^2)

*/void cselectionsort::sort()

{ for (int i=0; isort();

cout<<"排序後:"<

常見排序演算法總結

1.氣泡排序 蠻力法 基本思想 兩兩比較相鄰記錄,如果反序側交換,直到沒有反序的記錄為止。如果是正序排,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。時間複雜度 o n n void bubblesort int a,int n 優化的氣泡排序 if flag 0 break...

常見排序演算法(總結)

演算法名 時間複雜度 空間複雜度 穩定性氣泡排序o n2 o 1 不穩定 選擇排序o n2 o 1 不穩定 插入排序o n2 o 1 穩定 歸併排序o nlog n o n 可以優化到o 1 穩定 快速排序o nlog n o logn n 不穩定 堆排序o n logn o 1 不穩定 希爾排序o...

常見排序演算法總結

我們在平時的開發中,排序演算法可以說是最常用的演算法之一,不同的排序演算法,有著不一樣的效能消耗,雖說前端開發對演算法的要求沒有那麼高,但是對於一些常見的演算法,我們還是要掌握的,它屬於乙個開發者的基本功,今天,我們就來總結一下常見的排序演算法,請看下面這張表 下面排序都以由小到大排序為目的 1 基...