排序算法
来源:互联网 发布:mac 双分区 双系统 编辑:程序博客网 时间:2024/05/16 01:29
一、冒泡排序
#include <stdio.h>#define SWAP(x, y)x ^= y; y ^= x; x ^= y;int main(){int arr[] = {6,5,4,7,8,3,2,9,0,1};int ilen = sizeof(arr)/sizeof(int);int i,j;for(i=0; i<ilen; ++i){for(j=0; j<ilen-i-1; ++j){if(arr[j] > arr[j+1]){SWAP(arr[j], arr[j+1]);}}}for(i=0; i<ilen; ++i){printf("%d ", arr[i]);}printf("\n");}
二、选择排序
#include <stdio.h>#define SWAP(x, y)x ^= y; y ^= x; x ^= y;int main(){int arr[] = {5,6,7,4,3,8,9,2,1,0};int ilen = sizeof(arr)/sizeof(int);int i, j, pos;for(i=0; i<ilen; ++i){pos = i;for(j=i; j<ilen; ++j){if(arr[pos] > arr[j]){pos = j;}}if(pos > i){SWAP(arr[i], arr[pos]);}}for(i=0; i<ilen; ++i){printf("%d ", arr[i]);}printf("\n");return 1;}
三、直插排序
#include <stdio.h>int main(){int arr[] = {5,6,4,7,8,3,2,9,0,1};int ilen = sizeof(arr)/sizeof(int);int i,j,k;for(i=1; i<ilen; ++i){k = arr[i];for(j=i; j>0 && arr[j-1] > k; --j){arr[j] = arr[j-1];}arr[j] = k;}for(i=0; i<ilen; ++i){printf("%d ", arr[i]);}printf("\n");}
四、希尔排序
#include <stdio.h>int main(){int arr[] = {5,6,7,4,3,8,9,2,1,0};int ilen = sizeof(arr)/sizeof(int);int i,j,k,incr;for(incr = ilen/2; incr>0; incr /= 2){for(i=incr; i<ilen; i += incr){k = arr[i];for(j=i; j>0 && arr[j-incr] > k; j -= incr){arr[j] = arr[j-incr];}arr[j] = k;}}for(i=0; i<ilen; ++i){printf("%d ", arr[i]);}printf("\n");}
五、快速排序
//quicksort#include <stdio.h>void QSort(int arr[], int left, int right){int privot = arr[left];int i = left;int j = right;while(i<j){while(i<j && arr[j] >= privot){j--;}arr[i] = arr[j];while(i<j && arr[i] <= privot){i++;}arr[j] = arr[i];}arr[i] = privot;if(left < right){QSort(arr, left, i-1);QSort(arr, i+1, right);}}int main(){int arr[] = {5,6,7,4,3,8,9,2,1,0,2,4};int ilen = sizeof(arr)/sizeof(int);int i;QSort(arr, 0, ilen-1);for(i=0; i<ilen; ++i){printf("%d ", arr[i]);}printf("\n");return 1;}
六、归并排序
//mergesort#include <stdio.h>//合并void Merge(int arr[], int arrtmp[], int left, int center, int right){int lpos = left;//左边一半下标位置int rpos = center;//右边一半下标位置int leftVerge = center - 1;//左边一半边界int rightVerge = right;//右边一半边界int tmppos = left;//合并后存入临时数组下标位置int arrsize = right - left + 1;//当前合并长度int i;//依次合并while(lpos <= leftVerge && rpos <= rightVerge){if(arr[lpos] <= arr[rpos]){arrtmp[tmppos++] = arr[lpos++];}else{arrtmp[tmppos++] = arr[rpos++];}}while(lpos <= leftVerge){arrtmp[tmppos++] = arr[lpos++];}while(rpos <= rightVerge){arrtmp[tmppos++] = arr[rpos++];}//copyfor(i=0; i<arrsize; ++i, ++left){arr[left] = arrtmp[left];}}//合并排序void MSort(int arr[], int arrtmp[], int left, int right){int center = (left + right) / 2;if(left < right){MSort(arr, arrtmp, left, center);MSort(arr, arrtmp, center+1, right);Merge(arr, arrtmp, left, center+1, right);}}//主函数int main(){int arr[] = {5,6,7,4,3,8,9,2,1,0,2,4};int arrtmp[sizeof(arr)/sizeof(int)];int ilen = sizeof(arr)/sizeof(int);int i;MSort(arr, arrtmp, 0, ilen-1);for(i=0; i<ilen; ++i){printf("%d ", arr[i]);}printf("\n");return 1;}
七、堆排序
#include <stdio.h>#define SWAP(x, y)x ^= y; y ^= x; x ^= y;#define LeftChild(i) ( 2 * (i) + 1 )void PerDown(int arr[], int i, int ilen){int Child;int tmp;for(tmp = arr[i]; LeftChild(i)<ilen; i = Child){Child = LeftChild(i);if(Child != ilen - 1 && arr[Child+1] > arr[Child]){Child++;}if(tmp < arr[Child]){arr[i] = arr[Child];}else{break;}}arr[i] = tmp;}void HeapSort(int arr[], int ilen){int i;for(i=ilen/2; i>=0; --i){PerDown(arr, i, ilen);}for(i=ilen; i > 0; --i){SWAP(arr[0], arr[i]);PerDown(arr, 0, i);}}int main(){int arr[] = {5,6,7,4,3,8,9,2,1,0};int ilen = sizeof(arr)/sizeof(int);int i;HeapSort(arr, ilen-1);for(i=0; i<ilen; ++i){printf("%d ", arr[i]);}printf("\n");return 1;}
附一:shell 直插排序
#!bin/bash#insertsortfunction main(){declare arr=(5 6 7 4 3 8 9 2 1 0 6 4);declare ilen=${#arr[@]};declare i;declare j;declare v;declare k;for((i=1; i<ilen; ++i))dov=${arr[$i]};for((j=$i; j>0; --j))doif [ ${arr[($j-1)]} -lt $v ]; thenbreak;fiarr[$j]=${arr[$j-1]};donearr[$j]=$v;doneecho ${arr[*]};}mainexit 0
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- ListView 解析
- 2011年度全球移民国家移民条件浅析
- VS2008自定义快捷键设置
- python 代码覆盖率统计
- 实现信号延时的方法
- 排序算法
- WCF 学习笔记
- Android日记之2012/02/10——Android中的换行
- 任意分频的verilog语言实现
- msil
- lag(), lead()函数
- Base64编码的字符串 与 图片的 转换
- 图像变换 - 图像拉伸、收缩、扭曲、旋转 - 透视变换(cvWarpPerspective)
- 2012,我将开始新的人生,请见证我的改变吧!