Day20、冒泡、快速、选择、插入、二分查找

来源:互联网 发布:阿里云管理终端怎么用 编辑:程序博客网 时间:2024/06/13 04:41

算法:

算法是用来解决常见问题的方法

同一个问题可以采用多种方法解决,不同的方法适用于不同的环境

 

排序指的是把一组数字按照某种顺序排列好

排序算法分很多次执行,每次负责把一个数字放在合适的位置上

为了实现以上效果,可以先确定数字然后查找位置,也可以先确定位置再查找数字

通过不断调整两个数字的相互顺序,最终把合适的数字放在合适的位置上

 

1、冒泡排序算法

根据位置找数字,先确定位置,再把合适的数字填进去

每次把一个数字放在最前边或最后边的位置上

不断调整相邻两个数字的顺序最终把一个数字放在最前或最后的位置上

34 12 75 43 2755 68   按从小到大的顺序排列

经过一次处理把最大的数放在最后面

12 34 75 43 27 55 68   每次处理相邻的位置

12 34 75 43 27 55 68

12 34 43 75 27 55 68

12 34 43 27 75 55 68

12 34 43 27 55 75 68

12 34 43 27 55 68 75

 

  1#include<stdio.h>

  2 voidbubble_sort(int *p_num,int size){

  3     //把最大的数依次放到后面

  4     //第一次把最大的数放到下标为SIZE-1位置上

  5     //最后一次把最大的数放到下标为1的位置上

  6     int num=0,num1=0,tmp=0;

  7     for(num=size-1;num>=1;num--){

  8     //每次把一个数字放到下标为num的存储区里

  9         for(num1=0;num1<=num-1;num1++){

 10         //已处理过的数不需要再处理,所以每次排序的最后是num-1和num

 11         //调整下标为num1和num1+1存储区中数字的数序

 12            if(*(p_num+num1)>*(p_num+num1+1)){//只处理需要排列的数

 13                 tmp=*(p_num+num1);

 14                 *(p_num+num1)=*(p_num+num1+1);

 15                 *(p_num+num1+1)=tmp;

 16             }

 17         }

 18     }

 19 }

 20 int main(){

 21     int num=0;

 22     int arr[]={34,52,25,41,97,12,66,78,81};

 23     bubble_sort(arr,9);

 

2、选择排序算法

每次把一个数字放在最前边或最后边

用选定位置里的数字和所有其他数字做顺序调整,最终把合适的数字放在这个位置里

拿最后的数字与每个数字进行比较

34 12 75 43 27 5568

34 12 75 43 27 55 68

34 12 68 43 27 55 75

34 12 68 43 27 55 75

34 12 68 43 27 55 75

34 12 68 43 27 5575

 

34 12 68 43 27 55 75

34 12 68 43 27 55 75

34 12 68 43 27 55 75

34 12 55 43 27 68 75

……

 

  1#include<stdio.h>

  2 voidchoice_sort(int *p_num,int size){

  3     int num=0,num1=0,tmp=0;

  4     for(num=size-1;num>=1;num--){

  5         //把没处理过的数字中最大数字放在下标为num的存储区里

  6         for(num1=0;num1<=num-1;num1++){

  7         //调整num和num1存储区里数字的数序

  8             if(*(p_num+num1)>*(p_num+num)){

  9                 tmp=*(p_num+num1);

 10                 *(p_num+num1)=*(p_num+num);

 11                 *(p_num+num)=tmp;

 12             }

 13         }

 14     }

 15 }

 16 int main(){

 17     int num=0;

 18     int arr[]={34,52,25,41,97,12,66,78,81};

 19     choice_sort(arr,9);

 20     for(num=0;num<=8;num++){

 21         printf("%d  ",arr[num]);

 22     }

 23     printf("\n");

3、插入排序算法

把没有排好序的数字中最前面或最后面的数字插入到排好序的数字中合适的位置上

重复这个过程,直到把所有数字都放在合适的位置上

每次把要插入的数字和它前面或后面的数字进行顺序调整,重复这个过程直到它被放在合适的位置上

例:12 23 34 45 16 27 31   把16插到前面排好序的数字中合适的位置

12 26 34 16 45 27 31

12 26 16 34 45 27 31

12 16 36 34 45 27 31

12 16 36 34 27 45 31

……

  1 #include<stdio.h>

  2 void insert_sort(int*p_num,int size){

  3     int num=0,num1=0,tmp=0;

  4     for(num=1;num<=size-1;num++){

  5         //把下标为num的数字插入到前面合适的位置上

  6         for(num1=num-1;num>=0;num1--){

  7             //调整下标为num1和num1+1存储区里的数字

  8             if(*(p_num+num1)>*(p_num+num1+1)){

  9                 tmp=*(p_num+num1);

 10                 *(p_num+num1)=*(p_num+num1+1);

 11                 *(p_num+num1+1)=tmp;

 12             }

 13             else{

 14                 break;

 15             }

 16         }

 17     }

 18 }

 19 int main(){

 20     int num=0;

 21     int arr[]={34,52,25,41,97,12,66,78,81};

 22     insert_sort(arr,9);

 23     for(num=0;num<=8;num++){

24         printf("%d  ",arr[num]);

 25     }

 26     printf("\n");

 27     return 0;

 28 }

 

PS:12  |  23   34    45    16    27

         num(开始)

12    23    34   45  |  16     27

                          |  num 

12    23   34    16  |  45     27

                 num1 | num1+1

练习:上述方法是把最大的数字依次放在后面,现在把最小的数字依次放在前面

用冒泡和选择实现:

 冒泡

void bubble_sort(int *p_num,int size){

       int num=0,num1=0,tmp=0;

       for(num=0;num<=size-2;num++){

           for(num1=size-1;num1>=num+1;num1--){

               if(*(p_num+num1-1)>*(p_num+num1)){

                   tmp=*(p_num+num1-1);

                   *(p_num+num1-1)=*(p_num+num1);

                   *(p_num+num1)=tmp;

              }

          }

      }

  }

选择:

  void choice_sort(int *p_num,int size){

      int num=0,num1=0,tmp=0;

      for(num=0;num<=size-2;num++){

          for(num1=num+1;num1<=size-1;num1++){

              if(*(p_num+num)>*(p_num+num1)){

                   tmp=*(p_num+num);

                  *(p_num+num)=*(p_num+num1);

                   *(p_num+num1)=tmp;

              }

         }

     }

  }

4、快速排序算法

从所有数字的最左边或最右边选择一个数字作为基准数字,把它放在合适的位置上

对基准数字和其他数字依次进行顺序调整,把比它小的都放到它一边,把比它大的都放到另一边

对未处理的数字中两边的数字进行顺序调整,调整后把不是基准数字的数字排除在未处理范围之外

重复以上过程直到所有数字都被排除在未处理数字范围外,这时基准数字就被放在合适的位置上

对左右两部分数字重复以上过程,直到所有数字都被放在合适的位置上

例:

34 | 52  25  41  97  12                 34是基准数字

 34  52  25 41  97  12                 3412比较

 12 | 52  25  41 97   34             已经处理过的数12不再处理,比较34和52

 12 |34 25  41  97  | 52            52不再处理,处理34、97

 12 |34 25  41  | 97  52            处理34 、41

 12 |25  34  | 41 97  52             比较25   34  

 

#include<stdio.h>

void quick_sort(int *p_num,int size){

   int base=*p_num/* 基准数字 */ ,tmp=0;

   int *p_start=p_num,*p_end=p_num+size-1;//用指针和最外面两个存储区捆绑

   if(size<=1){

       return ;    //递归的分支

    }

   while(p_start<p_end){ //比较的是指针的位置

       if(*p_start>*p_end){//如果前面的数大于后面的数

           tmp=*p_start;

           *p_start=*p_end;

           *p_end=tmp;

       }

       if(*p_start==base){//如果基准数字在前面

           p_end--;

       }

       else{//基准数字在后

           p_start++;

       }

   }// 此时才把一个数字放在了合适的位置

   //(左边的数都比基准数字小,右边的数都比基准数字大)

   quick_sort(p_num,p_start-p_num);//上面循环结束后p_start和p_end都指向基准数字

   //对基准数字左边的数递归,重复以上过程

   quick_sort(p_start+1,p_num+size-1-p_start);

   //对基准数字右边的数递归,重复以上过程

}

int main(){

   int num=0;

   int arr[]={34,52,25,41,97,12,66,78,81};

   quick_sort(arr,9);

   for(num=0;num<=8;num++){

       printf("%d  ",arr[num]);

    }

   printf("\n");

   return 0;

}

 

 

查找

查找算法可以从一组数字里找到某一个数字

1、顺序查找

按顺序把每个数字和要查找的数字做对比,直到找到位置

如果数字之间没有规则,只能采用按顺序查找的方法

2、二分查找

只能从有顺序的一组数字中找到某个数字

每次用中间位置的数字和要查找的数字做对比,这样就可以排除一半的数字

重复以上过程直到找到结果:

#include<stdio.h>

int *half_search(const int *p_num,intsize,int num){

   const int *p_start=p_num , *p_end=p_num+size-1,*p_mid=NULL;

   while(p_start<=p_end/*首末之间只要还有存储区 */){  

       //每循环一次,排除一半的数字

       p_mid=p_start+(p_end+1-p_start)/2;

       if(*p_mid==num){ //如果要查找的数就是中间数

           return (int *)p_mid;    // (int *)是强制类型转换

       }

       else if(*p_mid>num){ //如果中间数大于我们要查找的数

           p_end=p_mid-1;  //则只查找中间数左边的部分

       }

       else{   // 如果中间数小于我们要查找的数

           p_start=p_mid+1;  //查找右边的书

       }

    }

   return NULL;  //如果直到退出上面循环,说明没找到

}

int main(){

    int *p_num=NULL;

   int arr[]={8,12,16,21,25,32,44,47};

   p_num=half_search(arr,8,44);  //函数指针

   if(p_num){

       printf("查找结果是%d\n",*p_num);

    }

   return 0;

}

0 0
原创粉丝点击