冒泡排序-----选择排序

 

冒泡排序速记口诀(降序):

 

N个数字来排序,两两相比大靠前,

 

外层循环N-1,内层循环N-1-i.

 

如果要升序,

 

只要把程序中的if (a[j] < a[j + 1])

 

小于号换成大于号就行了

 

 

定义数组:int array[10]={4,2,6 ,9 ,22,1,100};

冒泡排序的过程如下:

 

第一次冒泡:

 将第一个数4与第二个数2比较,4>2则位置不变,再将第二个数2与第三个数6进行比较,

               2<6,则将2与6交换位置。

以此类推,2<9,2与9交换位置,

              2<22,2与22交换位置,

  2>1,则位置不变,

            1<100,则1与100交换位置。

此趟结束后数组为{4,6,9,22,2,100,1}

 

第二次冒泡:

将4与6进行比较,4<6,交换位置,

                      4<9交换位置,

                     4<22交换位置,

4>2,位置不变,

                   2<100交换位置,

2>1位置不变

此趟结束后数组为{6,9,22,4,100,2,1}

 

第三次冒泡:

将6与9比较,  6<9交换位置,

                   6<22交换位置,

6>4位置不变, 4<100交换位置,

4>2位置不变,

2>1位置不变

此趟结束后数组为{9,22,6,100,4,2,1}

 

第四次冒泡:

将9与22比较,9<22交换位置,

9>6位置不变,

                  6<100交换位置,此后位置不变。

此趟结束后数组为{22,9,100,6,4,2,1}

 

 

第五次冒泡:

 

22与9比较位置不变,9与100比较,交换位置,此后位置不变。

此趟结束后数组为{22,100,9,6,4,2,1}

 

第六次冒泡:

 

22与100比较,交换位置,此后位置不变。

此趟结束后数组为{100,22,9,6,4,2,1}

 

#n为数组长度

 

其实现代码为

int i,j,t;

int a[n];

for( i=0;i<n-1;i++)

{

   for( j=0;j<n-i-1;j++)

  {

    if(a[j]>a[j+1])

 

      {    t=a[j];   a[j]=a[j+1];    a[j+1]=t;         }

  }

}



#include  

void main()   

{   

  int a[10];   

  int i,j,t;   

  printf("输入10个整数:\n");   

  for( i = 0; i < 10; i ++ )   

  scanf("%d",&a[ i ]); //依次输入10个整数  

  for( j = 0; j < 9; j ++ ) //进行9轮排序 即n-1次  

   {

   for( i = 0; i < 9-j; i ++) //每轮进行n-1-j 次比较,最多n-1-j 次交换

  if( a[ i ] > a[ i + 1 ] )

   {

   t = a[ i ] ;

   a[ i ] = a[ i + 1 ]; //小的沉底,大的上浮

   a[ i + 1 ] = t;

   }

   }

   printf("排序结果:");

   for( i = 0; i < 10; i ++ ) //依次输出排序结果

  printf("%d\t",a[ i ]);

   printf("\n"); 

}
View Code

 










//冒泡排序 #include <stdio.h> #define N 100 void sort(int n,int a[]) { int i,j,t ; for(i=0;i<n-1 ;i++) for(j=0;j<n-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } int main ( ) { int a[N],n ,i ; scanf("%d",&n); for(i=0;i<n ;i++) scanf("%d",&a[i]); sort(n,a) ; for(i=0;i<n-1 ;i++) printf("%d",a[i]); printf("%d\n",a[i]); } //冒泡排序 #include <stdio.h> void sort(int n,int a[]) { int i,j,t ; for(i=0;i<n-1 ;i++) for(j=0;j<n-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } int main ( ) { int b[5]={ 0 ,5, 3, 1 ,2 },i ; sort(5,b) ; for(i=0;i<5 ;i++) printf("%d ",b[i]); } //冒泡排序 #include <stdio.h> void sort(int n,int a[]); // 声明 //void sort(int n,int b[]); int main ( ) { int b[5]={ 0 ,5, 3, 1 ,2 },i ; sort(5,b) ; for(i=0;i<5 ;i++) printf("%d ",b[i]); } void sort(int n,int a[]) { int i,j,t ; for(i=0;i<n-1 ;i++) for(j=0;j<n-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } //冒泡排序 #include <stdio.h> void sort(int b[]); // 声明 //void sort(int a[]); int main ( ) { int b[5]={ 0 ,5, 3, 1 ,2 },i ; sort(b) ; for(i=0;i<5 ;i++) printf("%d ",b[i]); } void sort(int a[]) { int i,j,t ; for(i=0;i<5-1 ;i++) for(j=0;j<5-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } //冒泡排序 #include <stdio.h> void sort(int a[]); // 声明 int main ( ) { int a[5]={ 0 ,5, 3, 1 ,2 },i ; sort(a) ; for(i=0;i<5 ;i++) printf("%d ",a[i]); } void sort(int a[]) { int i,j,t ; for(i=0;i<5-1 ;i++) for(j=0;j<5-1-i ;j++) if(a[j]>a[j+1]) { t=a[j] ;a[j]=a[j+1] ;a[j+1]=t ;} } 与冒泡排序相比,选择排序的平均时间复杂度比冒泡排序稍高。
基本思想: 每一趟从待排序的元素中选出最小(或者最大)的一个元素顺序放在已排好序的数列的 最后,
直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法,
N个记录的文件的直接选择排序可经过N-1趟直接选择排序得到有序结果。

示例如下: 定义数组a[]={13,4,8,2,11,67,0}

第一趟:a[]={0,4,8,2,11,67,13}

第二趟: a[]={0,2,8,4,11,67,13}

第三趟:a[]={0,2,4,8,11,67,13}

第四趟:a[]={0,2,4,8,11,67,13}

第五趟:a[]={0,2,4,8,11,67,13}

第六趟:a[]={0,2,4,8,11,13,67}

算法描述如下:

int a[n];//定义数组,长度为n int i,j,t;

for(i=0;i<n-1;i++)

{   

for(j=i+1;j<n;j++)    

{     

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

   {          t=a[i];          a[i]=a[j];          a[j]=t;        }  

   }

}





#include
 void main()
  {int i,j,min,temp,a[11];
    printf("enter data:\n");
    for(i=1;i<=10;i++)
     {printf("a[%d]=",i);
       scanf("%d",&a[i]);//输入10个数
     }
    printf("\n");
    printf("The orginal numbers:\n");
    for(i=1;i<=10;i++)
      printf("%5d",a[i]);//输出这10个数
   printf("\n");
    for(i=1;i<=9;i++)//以下8行是对10个数排序
    {min=i;
       for(j=i+1;j<=10;j++)
         if(a[min]>a[i])  min=j;//以下是进行对换
      temp=a[i];
       a[i]=a[min];
       a[min]=temp;
     }
   printf("\n The sorted numbers:\n")
   for(i=1;i<=10;i++)
      printf("%5d",a[i]);//输出已排好的10个数
   printf("\n");
    
 }
View Code

 



#include <iostream>     //选择 
using namespace std;
void f(int a[],int n)
{
int i,j ,min,p,t ;
for(i=0 ; i<n-1 ;i++)
{
    min=a[i] ;  p=i ;
for(j=i+1 ; j<n ; j++)
 if(a[j]<min)     min=a[i],p=j ;            // if(a[j]<min)   min=a[i]    ;       p=j ;
 if(p!=i)      t=a[p] ,a[p]=a[i] ,a[i]=t ;
}
}

int main( )
{
int a[10],i ;
for(i=0 ; i<10 ; i++)
  cin>>a[i] ;
  f(a,10) ;
for(i=0 ; i<10 ; i++)
  cout<<a[i]<<endl  ;	
  
}








#include <iostream>            //选择  
using namespace std;
void f(int a[],int n)
{
int i,j ,min,p,t ;
for(i=0 ; i<n-1 ;i++)
{
     min=a[i] ;  p=i ;
for(j=i+1 ; j<n ; j++)
     if(a[j]<min)   min=a[i], p=j ;
  if(p!=i)      t=a[p] ,a[p]=a[i] ,a[i]=t ;
}
}

int main( )
{
int N ;
cin>> N;
 int a[N];
int i ;
for(i=0 ; i<N ; i++)
  cin>>a[i] ;
  
  f(a,N) ;
for(i=0 ; i<N ; i++)
  cout<<a[i]<<endl  ;	  
}







#include <stdio.h>     //选择

void sort(int a[]) ;
int main ( )
{
  int a[5]={ 9,6,8,3,-1},i ;
   sort(a) ;
   for(i=0 ;i<=4 ;i++)
   printf("%4d",a[i]) ;	

}

void  sort(int a[])
{ int i,j,t,k ;
 for(j=0 ; j<4 ;j++)      // j<3 ,4,5 ????
 {
 	k=j ;
 	for(i=j ;i<5 ;i++)
 	if(a[i]<a[k])  k=i ;
 	t=a[k] ,a[k]=a[j] ,a[j]=t ;
 }
	
}

















#include <stdio.h>    ////选择

void  sort(int a[])
{ 
int i,j,t,k,n ;
 for(j=0 ; j<3 ;j++)          //  j<3 ,4,5 ????
 {
 	k=j ;
 	for(i=j ;i<5 ;i++)
 	if(a[i]<a[k])  k=i ;
 	t=a[k] ,a[k]=a[j] ,a[j]=t ;
 }
	
}

int main ( )
{
  int a[5]={ 9,6,8,3,-1},i ;
   sort(a) ;
   for(i=0 ;i<=4 ;i++)
   printf("%4d",a[i]) ;	

}

  

 

 

 

 

C 冒泡排序 




冒泡排序描述

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序(in-place)。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。

冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要O(n2)次交换,而插入排序只要最多O(n)交换。天真的冒泡排序实作(类似下面)通常会对已经排序好的数列拙劣地执行(O(n2)),而插入排序在这个例子只需要O(n)个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在内部循环第一次执行时,使用一个旗标来表示有无需要交换的可能,也有可能把最好的复杂度降低到O(n)。在这个情况,在已经排序号的数列就无交换的需要。若在每次走访数列时,把走访顺序和比较大小反过来,也可以些微地改进效率。

冒泡排序算法的运作如下:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。
1.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
2.针对所有的元素重复以上的步骤,除了最后一个。
3.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

示例代码


复制代码
 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 
 4 void bubble_sort(int a[], const int size)
 5 {
 6     int flag = 0;
 7     int temp = 0;
 8     int i;
 9     for(i = 0; i < size - 1; i ++) {
10         flag = 1;
11         int j;
12         for(j = 0; j < size - i -1; j ++) {
13             if(a[j] > a[j + 1]) {
14                 temp = a[j];
15                 a[j] = a[j + 1];
16                 a[j + 1] = temp;
17                 flag = 0;
18             }
19         }
20         if(flag)
21             break;
22     }
23 }
24 
25 int main()
26 {
27     int number[] = {5,3,8,4,1,7,9,2,0,6};
28     bubble_sort(number, sizeof(int_array) / sizeof(int));
29     int i;
30     for(i = 0; i < sizeof(int_array) / sizeof(int); i ++)
31         printf("%d\n", number[i]);
32 }

复制代码

输出结果


复制代码
0
1
2
3
4
5
6
7
8
9

复制代码

原理

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。

优劣

  优点:稳定;缺点:慢,每次只能移动相邻两个数据。 
View Code
C 选择排序 




选择排序描述

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

 示例代码


复制代码
 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 
 4 void selection_sort(int data[], int count)
 5 {
 6     int i, j, min, temp;
 7     for(i = 0; i < count -1; i ++) {
 8         /*find the minimum*/
 9         min = i;
10         for(j = i + 1; j < count; j ++)
11             if(data[j] < data[min])
12                 min = j;
13         temp = data[i];
14         data[i] = data[min];
15         data[min] = temp;
16         printf("%d\n", min);
17     }
18 }
19 
20 int main()
21 {
22     int number[] = {5,3,8,4,1,7,9,2,0,6};
23     selection_sort(number, 10);
24     int i;
25     for(i = 0; i < 10; i ++)
26         printf("%d\n",number[i]);
27     exit(0);
28 }

复制代码

输出结果


复制代码
0
1
2
3
4
5
6
7
8
9

复制代码

算法分析

选择排序的交换操作介于0和(n − 1)次之间。选择排序的比较操作为n(n − 1) / 2次之间。选择排序的赋值操作介于0和3(n − 1)次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。 交换次数O(n),最好情况是,已经有序,交换0次;最坏情况是,逆序,交换n-1次。 交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。

原理

  每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

  选择排序是不稳定的排序方法(很多教科书都说选择排序是不稳定的,但是,完全可以将其实现成稳定的排序方法)。 

  n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

    ①初始状态:无序区为R[1..n],有序区为空。

    ②第1趟排序

      在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

    ③第i趟排序

     第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

  这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

优劣

  优点:移动数据的次数已知(n-1次);缺点:比较次数多,不稳定。
View Code

 

posted @ 2013-12-23 23:04  博园少主  阅读(598)  评论(0编辑  收藏  举报