1. 程式人生 > 其它 >C語言面試或日常應用中常見的幾種主要演算法

C語言面試或日常應用中常見的幾種主要演算法

技術標籤:演算法學習開發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;
}

執行結果:
在這裡插入圖片描述
以上就是我給大家介紹的幾種演算法、希望大家可以幫助獲得一些自己需要的東西;方法不一定是最好的,但應該是比較容易理解的。