数据结构排序之冒泡和选择

            现在在博客写冒泡排序和选择排序,我都认为自己有点脑残了尴尬尴尬尴尬,还是写写吧,我主要是想把排序好好整理一下,在自己最后复习查看的时候可以方便一点,就算忘记了,扫一下也就一目了然了,反正我不要手高眼低就可以了,难得不会就不会,但是简单的我绝对不能出错,作为一个程序猿就应该报这种态度好好撸代码。

先是选择排序吧,程序猿都懂,就是每次拿出一个数,然后和剩下的数进行比较,如果这个数比和它相比的数小的话,就进行交换(我说的顺序都是从小到大),在最坏的情况下,比较次数永远是n(n-1)/2,但是这个时间复杂度o(n^2)下面是一个完整代码,

 

#include<stdio.h>  
#include<time.h>  
#include<stdlib.h>  
void choosesort(int array[],int n)   // 实现选择排序的函数  
{  
    int i,j,t;  
    for(i=0;i<n-1;i++)   
	for(j=i+1;j<n;j++)		
         if(array[i]>array[j])
	 {
	      t=array[i];
	      array[i]=array[j];
	      array[j]=t;
	}

  
  
}  
int main()          // 主函数  
{  
    int array[100];  
    int i=0,n;  
    srand ( (unsigned)time (NULL) );  
    printf("请你输入要排序的个数: ");  
    scanf("%d",&n);  
    printf("随机产生%d个数: ",n);  
    for(i=0;i<n;i++)  
   {  
        array[i]=rand()%10+10; //产生10~20之间的数  
        printf("%d ",array[i]);  
    }  
    choosesort(array,n);   // 实现排序的函数  
    printf("\n排序之后为:",n);  
    for(i=0;i<n;i++)  
    {  
      printf("%d ",array[i]);  
    }  
    printf("\n");  
    return 0;  
}  


这一种选择排序还可以优化代码,就是遇到相同的时候,这种情况就不处理了,让程序继续进行,其实只要多用一个K变量,k=i,用k标记最小数的下标,然后进行if(k!=i)看k和i是否相等,不相等就证明找到了一个最小值,然后进行交换

void choosesort(int array[],int n)   // 实现选择排序的函数  
{  
    int i,j,t,k;  
    for(i=0;i<n-1;i++)   
    {
	k=i;//用k标记i
        for(j=i+1;j<n;j++)
	{
	    if(array[k]>array[j])

	       k=j;//记录最小数的坐标
	}
	if(k!=i)//判断k和i是否相等
	{
	     t=array[i];
	     array[i]=array[k];
	     array[k]=t;
	}
    }

  
  
}  


 

下面就是冒泡排序了,冒泡排序其实复杂度挺高的,最坏的情况下,时间复杂度o(n^2),两两比较时,一旦发现后面的元素比前面的小,就进行交换,然后进入下一次的循环,利用交换过的在和下一个比较,每进行一次第一层的for循环,冒泡排序就要沉淀一个元素,即就是沉底,

void maopaosort(int array[],int n)   // 实现排序的函数  
{  
    int i,j,t;  
    for(i=0;i<n;i++)   
	{

		for(j=0;j<n-i-1;j++)
			if(array[i]<array[j])
			{
			     t=array[i];
			     array[i]=array[j];
			     array[j]=t;
			}
	}

  
  
}  


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值