C语言排序问题

C语言常见的排序方法有:冒泡排序、选择排序、快速排序等等。
这里一一进行列举:
1.冒泡排序:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
ps:一列数组a[] = {85, 73, 62, 95, 87, 25, 12}; 采用冒泡排序法从小到大排序。
#include
int main()
{
int a[] = {85, 73, 62, 95, 87, 25, 12};
int i, j;
int t;
for(i = 0; i < 7 - 1; i++){
for(j = 0; j < 6 - i; j++){
if(a[j] > a[j + 1]){
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for(i = 0; i < 7; i++){
printf("%d\n", a[i]);
}
}
解析:
假设一维数组有N个数据,外层循环共循环(N-1)次;内层循环需要循环(N-1-i)次,i为此时外层循环的次数,当前边的数据小于后边的数据时,进行数据交换。

时间复杂度分析:
其外层循环执行 N - 1次。内层循环最多的时候执行N-1次,最少的时候执行1次,平均执行 (N+1-1)/2次。
所以循环体内的比较交换约执行 (N - 1)*N / 2 =(N^2-1)/2次。按照计算复杂度的原则,去掉常数,去掉最高项系数,其复杂度为O(N ^ 2)。

2.选择排序:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理选择一个值array[0]作为标杆,然后循环找到除这个值外最小的值(查找小于标杆的最小值),交换这两个值,这时最小值就被放到了array[0]上,然后再将array[1]作为标杆,从剩下未排序的值中找到最小值,并交换这两个值。选择排序是不稳定的排序方法。
#include
void selet_sort(int p, int n)
{
int i, j, tmp;
for(i=0;i {
int min = i;
for(j=i+1;j {
if(
(p+j)< *(p+min) )
min=j;
}
if(i!=j)
{
tmp=p[i];
p[i]=p[min];
p[min]=tmp;
}
}
}
int main()
{
int a[5]={3,5,1,2,4}, i;
selet_sort(a,5);
for(i=0;i<5;i++)
{
printf("%d\n", *(a+i));
}
}
时间复杂度分析:O(N^2),但与冒泡排序相比减少了数组交换的次数。

你可能感兴趣的:(C语言,算法)