C语言面试或日常应用中常见的几种主要排序算法

应用场景

下面给大家介绍几种算法:冒泡、插入、归并、快速;在软件开发面试或者项目开发中,用的比较普遍的,如采样一些数据需要取中间值都可以使用这些排序方法来获得。

冒泡排序:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ASC  1 // 升序
#define DESC 2 // 降序
void show(int numbers[], int len)
{    
    int i;    
    for(i=0; i<len; ++i)    
    {        
        printf("%d\t", numbers[i]);    
    }    
    printf("\n");
 }
void bubble_sort(int numbers[], int len, int order)
{    
    printf("冒泡%s序排序:\n", order==ASC ? "升":"降");    
    while(1)   
     {       
      bool done = true;        
      int i;        
      for(i=0; i<len-1; i++)        
      {           
      if((order==ASC)?(numbers[i] < numbers[i+1]):(numbers[i]>numbers[i+1]))           
        {                
           continue;            
        }                    
         int tmp;           
         tmp = numbers[i+1];            
         numbers[i+1] = numbers[i];            
         numbers[i] = tmp;
         done = false;   
       }
       if(done)            
        break;
      }
 }
int main(int argc, char **argv)
{   
 // generate some random numbers    
    srand(time(NULL));
    int i, numbers[10];    
    for(i=0; i<10; ++i)    
    {       
     numbers[i] = rand() % 1000;    
    }   
    printf("排序前的随机数:\n");    
    show(numbers, 10);
    
    // bubble sort    
    bubble_sort(numbers, 10, ASC);  // 按升序排列    
    show(numbers, 10);
    bubble_sort(numbers, 10, DESC); // 按降序排列    
    show(numbers, 10);
    
    return 0;
 }

运行结果:
在这里插入图片描述

插入排序:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void show(int numbers[], int len)
{    
     int i;      
     for(i=0; i<len; ++i)    
     {        
	 printf("%d\t", numbers[i]);       
     }   
    printf("\n");
}
void insertion_sort(int numbers[], int len)
{    
    if(len <= 1)       
    return;
    insertion_sort(numbers, len-1);
    int tmp = numbers[len-1];
    int i;    
    for(i=len-2; i>=0; --i)    
    {        
	   if(numbers[i] > tmp)            
	      numbers[i+1] = numbers[i];        
	   else            
	      break;       
    }
    numbers[i+1] = tmp;
 }
int main(int argc, char **argv)
{    
   // generate some random numbers    
    srand(time(NULL));
    int i, numbers[10];    
    for(i=0; i<10; ++i)   
     {        
        numbers[i] = rand() % 1000;   
     }    
      printf("排序前的随机数:\n");    
      show(numbers, 10);
    // insertion sort    
    printf("直接插入法排序:\n");    
    insertion_sort(numbers, 10);    
    show(numbers, 10);
    
   return 0;
}

运行结果:
在这里插入图片描述

归并排序:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void show(int numbers[], int len)
{    
   int i;    
   for(i=0; i<len; ++i)    
   {        
      printf("%d\t", numbers[i]);   
   }   
   printf("\n");
}
void _merge(int n1[], int len1,        int n2[], int len2)
{    
   assert(n1);    
   assert(n2);
   int n[len1 + len2];
   int i, j;   
   int k;    
   for(i=0, j=0, k=0; ; k++)    
    {        
    n[k] = n1[i] < n2[j] ? n1[i++] : n2[j++];
       if(i == len1)       
        {            
          memcpy(&n[k+1], &n2[j], (len2-j)*sizeof(int));            
          break;       
        }        
       if(j == len2)        
        {           
          memcpy(&n[k+1], &n1[i], (len1-i)*sizeof(int));           
           break;       
        }    
     }
   memcpy(n1, n, (len1+len2) * sizeof(int));
}
void merge_sort(int numbers[], int len)
{   
   if(len <= 1)        
   return;
   
   int mid = len/2;
   merge_sort(numbers+0,   mid);   
   merge_sort(numbers+mid, len-mid);
   _merge(numbers + 0  , mid,           
          numbers + mid, len-mid);
}
int main(int argc, char **argv)
{   
// generate some random numbers    
   srand(time(NULL));
   int i, numbers[10];    
   for(i=0; i<10; ++i)    
   {        
   numbers[i] = rand() % 1000;    
   }    
   printf("排序前的随机数:\n");    
   show(numbers, 10);
   
   // merge sort    
   merge_sort(numbers, 10);
   printf("归并排序:\n");    
   show(numbers, 10);
   
   return 0;
}

运行结果:
在这里插入图片描述

快速排序:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
void show(int numbers[], int len)
{    
  int i;    
  for(i=0; i<len; ++i)    
   {        
     printf("%d\t", numbers[i]);    
   }    
   printf("\n");
}
int partition(int numbers[], int len)
{    
 int tmp = numbers[0];
 int low = 0;    
 int high = len-1;
 while(low < high)   
  {        
      while(low < high && tmp <= numbers[high])                
              high--;        
         numbers[low] = numbers[high];
      while(low<high && numbers[low]<=tmp)               
              low++;        
         numbers[high] = numbers[low];   
   }
  numbers[low] = tmp;   
  return low;
}
void quick_sort(int numbers[], int len)
{    
 if(len <= 1)        
 return;

 int pivot = partition(numbers, len);
 quick_sort(numbers, pivot);    
 quick_sort(numbers+pivot+1, len-pivot-1);
}
int main(int argc, char **argv)
{    
  srand(time(NULL));  //随机生成数
  int i, numbers[10];    
  for(i = 0; i < 10; ++i)   
   {        
      numbers[i] = rand() % 1000;   
   }   
    printf("排序前的随机数:\n");   
    show(numbers, 10);
    
    printf("快速排序:\n");   
    quick_sort(numbers, 10);    
    show(numbers, 10);
     
 return 0;
}

运行结果:
在这里插入图片描述
以上就是我给大家介绍的几种算法、希望大家可以帮助获得一些自己需要的东西;方法不一定是最好的,但应该是比较容易理解的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值