@MicroCai
2015-03-22T23:29:44.000000Z
字数 2949
阅读 3451
计算机基础
「计算机基础」系列用以复习基础之用,文章整理自网络
排序算法种类众多,不看不知道,一看吓一跳
天噜啦,怎么这么多!算法这种东西用进废退,时间一久就忘了,本文根据维基百科整理几个较为常见的排序算法。
// C 语言实现
#include <stdio.h>
void bubble_sort(int arr[], int len)
{
int i, j, temp;
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main()
{
int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35};
int len = (int) sizeof(arr) / sizeof(*arr);
bubble_sort(arr, len);
int i;
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
// C 语言实现
void selection_sort(int arr[], int len)
{
int i, j, min, temp;
for (i = 0; i < len - 1; i++)
{
min = i;
for (j = i + 1; j < len; j++)
{
if (arr[min] > arr[j])
min = j;
}
if (min != i)
{
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}
// C 语言实现
void insertion_sort(int array[], int first, int last)
{
int i, j, temp;
for (i = first + 1; i <= last; i++)
{
temp = array[i];
for(j = i - 1; j >= first && array[j] > temp; j--)
{
array[j + 1] = array[j];
}
array[j+1] = temp;
}
}
void shell_sort(int arr[], int len)
{
int gap, i, j;
int temp;
for (gap = len >> 1; gap > 0; gap >>= 1)
{
for (i = gap; i < len; i++)
{
temp = arr[i];
for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
arr[j + gap] = arr[j];
arr[j + gap] = temp;
}
}
}
void merge_sort(int array[], unsigned int first, unsigned int last)
{
int mid = 0;
if(first<last)
{
/*mid = (first+last)/2;*/ /*注意防止溢出*/
/*mid = first/2 + last/2;*/
/*mid = ((first & last) + (first ^ last) >> 1);*/
mid = ((first & last) + ((first ^ last) >> 1));
merge_sort(array, first, mid);
merge_sort(array, mid+1,last);
merge(array,first,mid,last);
}
}
// 未使用 STL C++ 版
#include <utility>
using std::swap;
int partition(int* array, int left, int right)
{
int index = left;
//int pivot = array[index];
//swap(array[index], array[right]);
//上面两句是维基百科的写法,个人觉得有的多余
//经过群讨论之后,没问题,就改成下面这句
int pivot = array[right];
for (int i=left; i<right; i++)
{
if (array[i] > pivot) // 降序
swap(array[index++], array[i]);
}
swap(array[right], array[index]);
return index;
}
void qsort(int* array, int left, int right)
{
if (left >= right)
return;
int index = partition(array, left, right);
qsort(array, left, index - 1);
qsort(array, index + 1, right);
}
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆节点访问通常堆是通过一维数组来实现的。在起始数组为0的情形中:
在堆的数据结构中,堆中的最大值总是位于根节点。堆中定义以下几种操作:
更详细内容见维基百科的参考链接。