@MicroCai
2015-03-22T15:29:44.000000Z
字数 2949
阅读 3795
计算机基础
「计算机基础」系列用以复习基础之用,文章整理自网络
排序算法种类众多,不看不知道,一看吓一跳

天噜啦,怎么这么多!算法这种东西用进废退,时间一久就忘了,本文根据维基百科整理几个较为常见的排序算法。
// 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的情形中:
在堆的数据结构中,堆中的最大值总是位于根节点。堆中定义以下几种操作:
更详细内容见维基百科的参考链接。