应用场景
下面给大家介绍几种算法:冒泡、插入、归并、快速;在软件开发面试或者项目开发中,用的比较普遍的,如采样一些数据需要取中间值都可以使用这些排序方法来获得。
冒泡排序:
#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;
}
运行结果:
以上就是我给大家介绍的几种算法、希望大家可以帮助获得一些自己需要的东西;方法不一定是最好的,但应该是比较容易理解的。