各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序

来源:互联网 发布:js当前时间格式化 编辑:程序博客网 时间:2024/05/16 10:01

各种常见的排序

要开始找工作了,把以前学的各种小知识复习一遍,以下是各种常见的排序的简单实现(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序),至于原理就不写出来了,代码比较简单,看一下就懂,再不行可以随意找本书或百度!

#include <iostream>using namespace std;//冒泡void BubbleSort(int data[], int length){if(data == NULL || length <= 0)return ;for (int i = length - 1; i > 0; --i){int exchange = 1;for (int j = i - 1; j >= 0; --j){int tmp;if (data[i] < data[j]){tmp = data[i];data[i] = data[j];data[j] = tmp;}exchange = 0;}if(exchange)return;}}//冒泡排序void BubbleSort_2(int data[], int length){for (int i = 0; i < length - 1; ++i){int exchange = 0;for (int j = length - 1; j > i; --j){int tmp;if (data[j - 1] > data[j]){tmp = data[j];data[j] = data[j - 1];data[j - 1] = tmp;}exchange = 1;}if(!exchange)return;}}//直接插入排序void InsertSort(int data[], int length){if(data == NULL || length <= 0)return;for (int i = 1; i < length; ++i){int tmp = data[i];int j = i - 1;while (j >= 0 && data[j] > tmp){data[j + 1] = data[j];--j;}data[j + 1] = tmp;}}// 直接选择排序void SelectSort(int data[], int length){for(int i = 0; i < length - 1; ++i){int k = i;for(int j = i + 1; j < length; ++j){if (data[j] < data[k])k = j;}if (k != i){int tmp = data[i];data[i] = data[k];data[k] = tmp;}}}//快速排序void QuickSort(int data[], int start, int last){if(data == NULL || start > last)return;int i = start, j = last;if(start < last){int tmp = data[start];while(i != j){while (j > i && data[j] > tmp)--j;data[i] = data[j];while(i < j && data[i] < tmp )++i;data[j] = data[i];}data[i] = tmp;QuickSort(data, start, i - 1);QuickSort(data, i + 1, last);}}//希尔排序void ShellSort(int data[], int length){int gap = length / 2;while (gap > 0){for(int i = gap; i < length ; ++i){int tmp = data[i];int j = i - gap;while (j >= 0 && tmp < data[j]){data[j + gap] = data[j];j = j - gap;}data[j + gap] = tmp;//j = j - gap;}gap = gap / 2;}}void sift(int data[], int low, int high){// 若第一个元素的下标为0,则两个子节点的下标为:2 * 0 = 0, 2 * 0 + 1 = 1//不对(与父节点重合),这也就还前面说的第一个元素的下标要从1开始的原因。int i = low, j = 2 * i;int tmp = data[i];while (j <= high){if(j < high && data[j] < data[j + 1])++j;if(data[j] > tmp){data[i] = data[j];i = j;j *= 2;}elsebreak;}data[i] = tmp;}//堆排序void HeapSort(int data[], int length){for(int i = length / 2; i > 0; --i)sift(data, i, length);for (int j = length ; j > 1; --j){int tmp = data[1];data[1] = data[j];data[j] = tmp;sift(data, 1, j - 1);}}//归并排序void Merge(int data[], int low, int mid, int high){//一次归并// 将相邻两个有序表 [low, mid],[mid + 1, high] 合并到一个表中if (data == NULL || low < 0 || low > mid || mid > high)return;int i = low, j = mid + 1;//int *data_tmp = (int *)malloc(sizeof(int) * (high - low + 1));int *data_tmp = new int[high - low + 1];int k = 0;while(i <= mid && j <= high){if (data[i] <= data[j]){data_tmp[k] = data[i];++i;++k;}else {data_tmp[k] = data[j];++k;++j;}}while (i <= mid){data_tmp[k] = data[i];++i;++k;}while(j <= high){data_tmp[k] = data[j];++j;++k;}for (int k = 0, i = low; i <= high; ++i, ++k)data[i] = data_tmp[k];}void MergePass(int data[], int extent, int length){//归并两个长度为extent的有序表if(data == NULL || extent <= 0 || extent > length)return;int i;for (i = 0; i + 2 * extent < length; i += 2 * extent)Merge(data, i, i + extent - 1, i + 2 * extent - 1);// 可能还剩下一些单的没有配对的元素if(i + extent - 1 < length)   //若最后元素剩下小与一个extent的长度,则没必要归并Merge(data, i, i + extent - 1, length - 1);}void MergeSort(int data[], int length){if(data == NULL || length <= 0)return;for(int extent = 1; extent < length; extent *= 2)MergePass(data, extent, length);}void main(){int data[] = {0,9,8,7,1,5,6,3,4,2,45,26,789,12,79,7832,4565,413,46,455,78,58};//BubbleSort_2(data,22);//InsertSort(data,22);//InsertSort(data,22);//QuickSort(data, 0, 21);//ShellSort(data,22);//HeapSort(data, 21);   // 第一个元素没有算进去MergeSort(data,22);for(int i = 0; i < 22; ++i)cout << data[i] << " ";cout << endl;}

至于基数排序和桶排序,以前写过所以这里就不重复了,在

http://blog.csdn.net/xwchao2014/article/details/44804087


0 0
原创粉丝点击