常见排序算法

#include<stdio.h>
#include<string.h>
#include<unistd.h>

1.冒泡排序(Bubble Sort)
在这里插入图片描述

/*
1.比较相邻的元素。如果第一个比第二个大,就交换它们两个
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
3.针对所有的元素重复以上的步骤,除了最后一个
4.重复步骤1~3,直到排序完成
 */
void bubble_sort(int *data, int length)
{
   int i,j,temp;
   int *ptr = data;
 
   if(NULL!=ptr){
      for(i = 0;i < length-1;i++){
         //轮询一次,会把最大的元素放到数组最后的位置
         for(j=0;j< length-1-i;j++){
            if(ptr[j]>ptr[j+1]){
               temp = ptr[j];
               ptr[j] = ptr[j+1];
               ptr[j+1] = temp;
            }
        }
      } 
   }else{
        printf("#bubble_sort#The parameter data is incorrect!!!!");
   }
}

————————————————————————————————————————————————————

2.选择排序(Selection Sort)
在这里插入图片描述

/*
 1.先遍历查找数组中最小的元素
 2.把数组中第一个元素跟最小元素交换位置
 3.从第二个位置开始,查找数组中最小的元素
 4.把数组中第二元素跟最小的元素交换位置
 5......依次类推,直到最后一个元素为止
 */
void selection_sort(int *data, int length)
{
    int temp,i,j,index;
    int *ptr = data;
 
    if(NULL != ptr){
        for(i=0; i<length-1; i++){
           index = i;
           //从前往后遍历查找最小值index
           for(j = i+1;j<length;j++){
              if(ptr[index] > ptr[j]){
                   index = j;//更新最小元素的index
                }
           }
          //把data中的第i元素跟最小的元素交换,经过一轮遍历,
          //已经把数组中最小的数放到数组第1个位置了,接着依次轮询
          temp = ptr[index];
          ptr[index] = ptr[i];
          ptr[i] = temp;
         } 
    }else{
         printf("#selection_sort#The parameter data is incorrect!!!!");
    }
}

———————————————————————————————————————————————————————
3.插入排序(Insertion Sort)
在这里插入图片描述

/*
1.从第一个元素开始,该元素可以认为已经被排序;
2.取出下一个元素,在已经排序的元素序列中从后向前扫描;
3.如果该元素(已排序)大于新元素,将该元素移到下一位置;
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5.将新元素插入到该位置后;
6.重复步骤2~5。
 */
 void insertion_sort(int *data,int length)
 {
    int preindex,current,i;
    int *ptr = data;
    
    if(NULL!=ptr){
          for(i=1;i<length;i++){
             preindex = i-1;//记录当年节点前一个index
             current = ptr[i];//保存当前遍历最新的值
             //从后往前遍历所有的值,直到找到一个小于current的值为止
              while(preindex >=0 && ptr[preindex] > current){
                   ptr[preindex+1] = ptr[preindex];
                   preindex--;
             }
             //把保存的最新值插入到合适的位置
            ptr[preindex+1] = current;
          }
    }else{
        printf("#insertion_sort#The parameter data is incorrect!!!!");
     }   
}

——————————————————————————————————————————————————————
4、希尔排序(Shell Sort)
在这里插入图片描述

//是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素
//先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序
void shell_sort(int *data,int length)
{
     int group ,i;
     int *ptr = data;
     int num = 0;
     if(NULL!=ptr){
          for(group = (int)(length/2); group > 0; group = (int)(group/2)){
              num++;
              printf("第%d次轮询\n",num);
              for (i = group; i < length; i++){
                    int index = i;
                    int current = ptr[i];
                    printf("\n");
                    printf("index:%d, current:%d, group = %d\n",index,current,group);
                    if(ptr[index] < ptr[index-group]){
                          while(index - group >= 0 && current < ptr[index-group]){
                               ptr[index] = ptr[index-group];
                               index = index - group;
                           }
                          ptr[index] = current;
                    }
                   for(int j = 0; j< 11;j++)
                       printf("%d  ",ptr[j]);
               }
              printf("\n");
          }
     }else{
          printf("#shell_sort#The parameter data is incorrect!!!!");
    }
     return;
}

5.快速排序

void quick_sort(int s[], int left, int right)
{
    if (left <right){
        //以第一个数作为关键key
        int i = left, j = right, key = s[left];
        while(i < j){
             //从右向左查找第一个小于key的数
            while((i < j)&& s[j] >= key)
                  j--;
            if (i < j){
                 //把右边小于key的数填到i的位置,i往后移动一位
                 s[i++] = s[j];
            }
            //从左向右查找第一个大于key的数
            while((i < j) && s[i] < key)
                   i++;
            if (i<j){
                 //把左边大于key的数填到j的位置,同时j往前移动一位
                 s[j--] = s[i];
           }
      }
      //当i = j的时候,把key插入到i的位置
      s[i] = key;
      for (int i = 0; i <= right - left; i++){
           printf("%d  ", s[i]);
      }
      printf("\n");
      quick_sort(s,left,i-1);
      quick_sort(s,i+1,right);
    }
    return;
}

——————————————————————————————————————————————

验证各个排序接口:

void main(int argc, char **argv)
{
   int i = 0;
   int a[] = {7,3,9,5,4,8,2,10,1,6,11};
   int length = (int)(sizeof(a)/sizeof(a[0]));
   insertion_sort((int*)&a,length);
   // bubble_sort((int*)&a,length);
   // selection_sort((int*)&a,length);
   //shell_sort((int*)&a,length);
   //quick_sort((int*)&a,0,length-1)
   printf("\n");
   for (int i = 0; i < length; ++i)
   {
      printf("%d  ", a[i]);
   }
   return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值