1、摘要
历次找工作,经常会被要求写排序算法,每次都写冒泡排序,而且每次都很心虚。不是因为怕写的不对,而是因为自己的数据结构、算法基本功不扎实。越来越觉得这些重要,不仅仅是理解原理那么简单,而是觉得应该自己能够随手实现它们,最少能够实现一个大概。
本文实现几种内排序。接下来会依次实现其他一些算法。
2、排序算法实现
这个页面介绍了排序是什么,以及简单提到了内排序和外排序的区别。而
这篇文章则详细介绍了几种排序的思想,并给出了Pascal语言的实现。
常见内排序包括插入排序、冒泡排序、快速排序、直接选择排序、堆排序、希尔排序和归并排序等。其中
快速排序则为这些排序中的大牌明星,其平均效率远低于其他排序方法。
下面列出几个排序算法的C语言实现,以便日后查阅。
l 冒泡排序
void bubblesort(int ori[], int len)
{
int i, j;
for (i = 0; i < len; i++)
{
for (j = 0; j < len - i - 1; j++)
{
if (ori[j] > ori[j + 1])
{
swap(&ori[j], &ori[j + 1]);
}
}
}
}
l 插入排序
void insertsort(int ori[], int len)
{
int i, j, tmp;
for (i = 1; i < len; i++)
{
tmp = ori[i];
j = i;
while (j > 0 && tmp < ori[j - 1])
{
ori[j] = ori[j - 1];
j--;
}
ori[j] = tmp;
}
}
l 直接选择排序
void selectsort(int ori[], int len)
{
int i, j, tmp;
for (i = 0; i < len; i++)
{
for (j = i + 1; j < len; j++)
{
if (ori[i] > ori[j])
{
swap(&ori[i], &ori[j]);
}
}
}
}
l 快速排序
快速排序稍微复杂一点,用到两个函数,其中getpivot函数的功能是获取支点元素,该元素从数组首尾以及中间位置的数中获取,获取规则是将这三个数排序,取中间值。需要注意的是这三个数被排序以后,最大的放在数组最后,最小的放在数组最前,而中间那个数则和倒数第二个数交换位置。
void quicksort(int data[], int start, int end)
{
int i, j, pivot;
if (start + 3 <= end)
{
pivot = getpivot(data, start, end);
i = start;
j = end - 1;
for ( ; ; )
{
while (data[++i] < pivot);
while (data[--j] > pivot);
if (i < j)
{
swap(&data[i], &data[j]);
}
else
break;
}
swap(&data[i], &data[end - 1]);
quicksort(data, start, i - 1);
quicksort(data, i + 1, end);
}
else
{
bubblesort(&data[start], end - start + 1);
}
}
static int getpivot(int data[], int start, int end)
{
int mid = (start + end) / 2;
data[start] > data[mid] ? swap(&data[start], &data[mid]) : NULL;
data[start] > data[end] ? swap(&data[start], &data[end]) : NULL;
data[mid] > data[end] ? swap(&data[mid], &data[end]) : NULL;
swap(&data[mid], &data[end - 1]);
return data[end - 1];
}
以上函数用到swap函数,用于交换两个数的值。
static void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
3、作者手记
作者:悠乐,
青娱乐开发工程师。
4、更新日志
5、参考文档
6、相关文档