C++ 八种排序算法总结及实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

八种排序算法总结之C++版本

五种简单排序算法

一、冒泡排序【稳定的】

void BubbleSort( int* a,int Count ) //实现从小到大的最终结果

{

int temp;

for(int i=1; i=i; j--)

if( a[j] < a[j-1] )

{

temp = a[j];

a[j] = a[j-1];

a[j-1] = temp;

}

}

现在注意,我们给出O方法的定义:

若存在一常量K和起点n0,使当n>=n0时,有f(n)<=K*g(n),则f(n) = O(g(n))。(呵呵,不要说没学好数学呀,对于编程数学是非常重要的!!!)

现在我们来看1/2*(n-1)*n,当K=1/2,n0=1,g(n)=n*n时,1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以f(n) =O(g(n))=O(n*n)。所以我们程序循环的复杂度为O(n*n)。

二、交换排序【稳定的】

void ExchangeSort( int *a,int Count)

{

int temp;

for(int i=0; i

for(int j=i+1; j

if( a[j] < a[i] )

{

temp = a[j];

a[j] = a[i];

a[i] = temp;

}

}

时间复杂度为O(n*n)。

三、选择法【不稳定的】

void SelectSort( int *a,int Count)

{

int temp; //一个存储值

int pos; //一个存储下标

for(int i=0; i

{

temp = a[i];

pos = i;

for(int j=i+1; j

if( a[j] < temp ) //选择排序法就是用第一个元素与最小的元素交换

{

temp = a[j];

pos = j; //下标的交换赋值,记录当前最小元素的下标位置}

a[pos] = a[i];

a[i] = temp;

}

}

遗憾的是算法需要的循环次数依然是1/2*(n-1)*n。所以算法复杂度为O(n*n)。

我们来看他的交换。由于每次外层循环只产生一次交换(只有一个最小值)。所以f(n)<=n 所以我们有f(n)=O(n)。所以,在数据较乱的时候,可以减少一定的交换次数。

四、插入法【稳定的】

void InsertSort( int *a,int Count)

{

int temp; //一个存储值

int pos; //一个存储下标

for(int i=1; i

{

temp = a[i]; //当前要插入的元素

pos = i-1;

while( pos>=0 && temp

{

a[pos+1] = a[pos]; //将前一个元素后移一位

pos--;

}

a[pos+1] = temp;

}

}

其复杂度仍为O(n*n)。

最终,我个人认为,在简单排序算法中,直接插入排序是最好的。

五、希尔排序法【不稳定的】

/*

* 希尔排序,n为数组的个数

*/

void ShellSort( int arr[], int n )

{

int temp,pos;

int d = n; //增量初值

do{

d = d/3 + 1 ;

for(int i= d; i

{

temp = arr[i];

pos = i-d;

while( pos>=0 && temp < arr[pos] ) { //实现增量为d的插入排序arr[ pos + d ] = arr[pos];

pos -= d;

}

arr[ pos + d ] = temp;

}

} while( d > 1 );

}

三种高级排序算法

一、快速排序辅助空间复杂度为O(1)【不稳定的】

void QuickSort( int *a,int left, int right)

{

int i,j,middle,temp;

i = left;

j = right;

middle = a[ (left+right)/2 ];

do

{

while( a[i]

i++;

while( a[j]>middle && j>left ) //从右扫描小于中值的数

j--;

if( i<=j ) //找到了一对值

{

temp = a[i];

a[i] = a[j];

相关文档
最新文档