选择排序,冒泡排序,双向冒泡排序

     冒泡排序和选择排序是最基本的排序方式,要掌握。

       冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

       选择排序每一趟从待排序的数据元素选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。冒泡排序和选择排序定义来自百度百科。

          举个例子来说明,相信大家都军训过,没军训过的也排队过。以军训来说,在一开始的报道的时候,大家排成一排时,是参差不齐,高矮掺杂,教官看了这个心情肯定很不爽要求你们从低到高排列。

       冒泡排序:从第一个人开始比较,no1和no2比较,如果no1比no2高,那么两个人交换顺序,知道最后一个,最高的肯定在最后面了,这时候重新从第一个人开始比较,直到倒数第二个,因为最后一个已经排完了。(代码是从最后比上来,思想是一样的)

PS:假如那个最高个的在第一个,那么一直比较下去,他会一直和后面的人换位置,就好像冒泡泡似的,所以这就是冒泡排序。

       双向冒泡排序:顾名思义,就是从两边冒泡排序,在同一趟比较中,从前面比较的,将高的顶到后面去,从后面比较的,将矮的顶到前面来。

       选择排序:还是从第一个人开始,依次和后面的人比较,但是这个时候不交换位置,只是记录最矮那个人的位置(比如第五个)一直比较到最后一个人,然后将第五人和第一人交换位置,接下来从第二个人开始依次比较下去。

    ----------------------

  更新:忘记说稳定排序和不稳定排序了。

稳定排序的意思是,小东和小明一样高,在排序前,小东是站在小明前面的,排序后,小东还是站在小明前面。

不稳定排序则是排序后小东跑到小明后面去了。


</pre><pre code_snippet_id="383221" snippet_file_name="blog_20140609_2_7667410" name="code" class="cpp">#include<stdio.h>
#define N 10

void BubbleSort(int *BS , int n)
{
   int i=0;
   int j=0;
   int temp;
   
   for( i=N-1; i>-1 ; i--)
   {
	   //注意别让数组越界
	   for(j=0;j<i;j++)
	   {
                 if(BS[j]>BS[j+1])
		  {
			  temp=BS[j];
			  BS[j]=BS[j+1];
			  BS[j+1]=temp;
		  }
	   }
   }
}

void SelectionSort(int *ss, int n)
{

	int i;
	int j;
	int k;
	int temp;
	for(i=0; i<n-1 ; i++)
	{
		k=i;
		for(j=i+1; j<n ; j++)
		{
			//记录数小的位置
                      if(ss[k]>ss[j])
			   k=j;
		}

		//k!=i则说明,有更小的数在后面,把它换到前面来
		if(k!=i)
		{
			temp=ss[i];
			ss[i]=ss[k];
			ss[k]=temp;
		}
	}

}

void BubbleTwo( int *p , int n)
{
   int i;
   int low_point,high_point;
   int high=n-1;  
   int low=0;
   int temp;

   while(high>low)
   {
	   high_point=low;
	   low_point=high; 
	    //为什么要在这里赋值呢?
	   //注意,我们下面的high_point 和 low_point是在if里面才有记录的,
	   //也就是说,如果一个序列已经是排好的,那么if语句是进不去的,那么就会进入死循环

	   for(i=0;i<high;i++)
	   {
		   if( p[i]>p[i+1] )
		   {
			   //把大的往后面冒,并将最后一次有交换的位置记下来,
			   //如果不记的话,只能从倒数第二个开始,这样即使你后面的本来就是排好了的也要再循环,浪费时间
			   temp=p[i];
			   p[i]=p[i+1];
			   p[i+1]=temp;
                           high_point=i;
		   }

		   if( p[high+low-i] < p[high+low-i-1])
		   {
                           temp=p[high+low-i];
			   p[high+low-i]=p[high+low-i-1];
			   p[high+low-i-1]=temp;
			   low_point = high+low-i;
		   }
	   }
	   low=low_point;
	   high=high_point;
   }
}


void printArray(int *p)
{
	int i;
   	for(i=0;i<N;i++)
	   printf("%d ",p[i]);
    printf("\n");
}


int main()
{
        int BS[N]={3,5,2,4,9,56,3,-5,1,0};
	int BT[N]={5,8,3,9,1,0,4,34,-4,11};
        int SS[N]={8,6,5,4,9,3,2,7,1,13};
    
	printf("******冒泡排序之前******\n");
	printArray( BS );
        BubbleSort( BS , N);
        printf("******冒泡排序之后******\n");
	printArray( BS );

	printf("\n******双向冒泡排序之前******\n");
	printArray( BT );
        BubbleTwo( BT , N );
        printf("******双向冒泡排序之后******\n");
	printArray( BT );

	
	printf("\n******选择排序之前******\n");
	printArray( SS );
	SelectionSort(SS, N);
	printf("******选择排序之前******\n");
	printArray( SS );

	return 0;
}</span>




 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值