// 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 基...