插入排序 希尔排序 C++
最優(yōu)時(shí)間復(fù)雜度為o(n),又稱(chēng)縮小增量排序。
邏輯分析:
1、希爾排序首先是確定增量,默認(rèn)的希爾增量(不一定是最優(yōu))為length/2。
2、根據(jù)增量分組,將分組的元素利用直接插入法排序。
3、增量=增量/2,再次分組,一直到增量為1為止。
? ? 通過(guò)上述步驟我們可以知道,代碼會(huì)有3個(gè)循環(huán),第一個(gè)gap的更新,即for(int gap=len/2;gap>0;gap/=2)。第二個(gè)和第三個(gè)循環(huán)是對(duì)分組數(shù)組進(jìn)行直接插入排序。
代碼分析:
?數(shù)組a[] = { 2,1,4,5,3,8,7,9,0,6 },length=10。
第一次大循環(huán)
gap=length/2=5,i=5,j=i-gap=0,a[j]=2<a[j+gap]=8,此時(shí)數(shù)組不做任何操作。
gap=length/2=5,i=6,j=i-gap=1,a[j]=1<a[j+gap]=7,此時(shí)數(shù)組不做任何操作。
gap=length/2=5,i=7,j=i-gap=2,a[j]=4<a[j+gap]=9,此時(shí)數(shù)組不做任何操作。
gap=length/2=5,i=8,j=i-gap=3,a[j]=5<a[j+gap]=0,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 2,1,4,0,3,8,7,9,5,6 }。
gap=length/2=5,i=9,j=i-gap=4,a[j]=3<a[j+gap]=6,此時(shí)數(shù)組不做任何操作。
第二次大循環(huán)
gap=gap/2=2,i=2,j=i-gap=0,a[j]=3<a[j+gap]=4,此時(shí)數(shù)組不做任何操作。
gap=gap/2=2,i=3,j=i-gap=1,a[j]=1>a[j+gap]=0,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 2,0,4,1,3,8,7,9,5,6 }。
gap=gap/2=2,i=4,j=i-gap=2,a[j]=4>a[j+gap]=3,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 2,0,3,1,4,8,7,9,5,6 }。
gap=gap/2=2,i=4,j=i-gap=0,a[j]=2<a[j+gap]=3,此時(shí)數(shù)組不做任何操作。
gap=gap/2=2,i=5,j=i-gap=3,a[j]=1<a[j+gap]=8,此時(shí)數(shù)組不做任何操作。
gap=gap/2=2,i=6,j=i-gap=4,a[j]=4<a[j+gap]=7,此時(shí)數(shù)組不做任何操作。
gap=gap/2=2,i=7,j=i-gap=5,a[j]=8<a[j+gap]=9,此時(shí)數(shù)組不做任何操作。
gap=gap/2=2,i=8,j=i-gap=6,a[j]=7>a[j+gap]=5,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 2,0,3,1,4,8,5,9,7,6 }。
gap=gap/2=2,i=9,j=i-gap=7,a[j]=9>a[j+gap]=6,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 2,0,3,1,4,8,5,6,7,9 }。
第三次大循環(huán)
gap=gap/2=1,i=1,j=i-gap=0,a[j]=2>a[j+gap]=0,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 0,2,3,1,4,8,5,6,7,9 }。
gap=gap/2=1,i=2,j=i-gap=1,a[j]=2<a[j+gap]=3,此時(shí)數(shù)組不做任何操作。
gap=gap/2=1,i=3,j=i-gap=2,a[j]=3>a[j+gap]=1,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 0,2,1,3,4,8,5,6,7,9 }。
gap=gap/2=1,i=3,j=j-gap=1,a[j]=2>a[j+gap]=1,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 0,1,2,3,4,8,5,6,7,9 }。
gap=gap/2=1,i=3,j=j-gap=0,a[j]=0<a[j+gap]=1,此時(shí)數(shù)組不做任何操作。
gap=gap/2=1,i=4,j=i-gap=3,a[j]=3<a[j+gap]=4,此時(shí)數(shù)組不做任何操作。
gap=gap/2=1,i=5,j=i-gap=4,a[j]=4<a[j+gap]=8,此時(shí)數(shù)組不做任何操作。
gap=gap/2=1,i=6,j=i-gap=5,a[j]=8>a[j+gap]=5,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 0,1,2,3,4,5,8,6,7,9 }。
gap=gap/2=1,i=6,j=j-gap=4,a[j]=4<a[j+gap]=5,此時(shí)數(shù)組不做任何操作。
gap=gap/2=1,i=7,j=i-gap=6,a[j]=8>a[j+gap]=6,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 0,1,2,3,4,5,6,8,7,9 }。
gap=gap/2=1,i=7,j=j-gap=5,a[j]=5<a[j+gap]=6,此時(shí)數(shù)組不做任何操作。
gap=gap/2=1,i=8,j=i-gap=7,a[j]=8>a[j+gap]=7,故交換a[j]和a[j+gap],數(shù)組a[]=?{ 0,1,2,3,4,5,6,7,8,9 }。
gap=gap/2=1,i=8,j=j-gap=6,a[j]=6<a[j+gap]=7,此時(shí)數(shù)組不做任何操作。
gap=gap/2=1,i=9,j=i-gap=8,a[j]=8<a[j+gap]=9,此時(shí)數(shù)組不做任何操作。
排序完成,輸出數(shù)組a[]=?{ 0,1,2,3,4,5,6,7,8,9 }。
#include<iostream> #include<cstdlib>using namespace std;//交換 void swap(int &a, int &b) {int temp = a;a = b;b = temp; }//希爾排序,首先根據(jù)增量分組,然后對(duì)分組元素進(jìn)行直接插入排序 void shellSort(int a[], int length) {for (int gap = length/2; gap>0; gap/=2){for (int i = gap; i<length;++i){for (int j = i - gap; j >=0 && a[j] > a[j + gap]; j -= gap){swap(a[j], a[j + gap]);}}}}int main() {int a[] = { 2,1,4,5,3,8,7,9,0,6 };shellSort(a, 10);for (int i = 0; i < 10; i++){cout << a[i] << "";}cout << endl;system("pause");return 0;}發(fā)現(xiàn)上述代碼真的有好多重復(fù)的地方,加了一個(gè)標(biāo)志,來(lái)改進(jìn)一下
#include<iostream> #include<cstdlib>using namespace std;void swap(int &a, int &b) {int temp = a;a = b;b = temp; }void shellSort(int a[], int length) {for (int gap = length/2; gap>0; gap/=2){for (int i = gap; i<length;++i){bool action = true;for (int j = i - gap; j >=0 && action; j -= gap){if (a[j] > a[j + gap]){swap(a[j], a[j + gap]);}else action = false;}}}}int main() {int a[] = { 65,44,77,5,24,89,72,58,40,69 };shellSort(a, 10);for (int i = 0; i < 10; i++){cout << a[i] << " ";}cout << endl;system("pause");return 0;}?
總結(jié)
以上是生活随笔為你收集整理的插入排序 希尔排序 C++的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++插入排序算法
- 下一篇: 晚上不吃饭能瘦十斤吗