排序算法

来源:互联网 发布: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




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 该商品不支持在当前地区销售怎么办 此商品不支持在当前地区销售怎么办 村淘商品在淘宝没展现怎么办 qq音乐不小心充了会员怎么办 古奇的包五金磨掉色了怎么办 淘宝购物津贴买的东西退款怎么办 淘宝买的东西质量太差怎么办 咸鱼上买的东西有问题怎么办 咸鱼买到的东西有问题怎么办 天猫超市买的东西有问题怎么办 满白天的宝宝睡觉总哭怎么办 京东退货显示在售后检测要怎么办 装修公司定金交了公司关门怎么办 背冷、腰泠、屁股冷、大腿冷怎么办 买家退款把卖家地址写错了怎么办 退款编号写错了提交了怎么办 京东购物收到货第二天搞活动怎么办 玩王者荣耀来电话断网怎么办 苹果7p玩王者荣耀卡怎么办 手机丢了隐私空间里面的照片怎么办 微信内存满了打不开了怎么办 u盘内存满了打不开了怎么办 清算组出的报告书无法清算怎么办 手机停机了收不到快递取件码怎么办 买东西货到了不小心确认收货怎么办 不小心用了蚂蚁花呗怎么办 q微店忘记密码怎么办微忘记密 在优酷买了开通会员不想续费怎么办 微店怎么卖吃的要认证怎么办 在天猫买东西遇到不讲理卖家怎么办 天猫退货收到退款了卖家拒绝怎么办 申请退款保证金不够的情况下怎么办 发奖品把钱骗走了应该怎么办? 淘宝东西没到自动确认了收货怎么办 淘宝买的东西收不到货怎么办 资料如实填了 怎么办不下来借款啊 如果淘宝店家跑了没收到货怎么办 淘宝店家退完款把货又发了怎么办 淘宝收到货有问题客服不回复怎么办 手机从美国寄回中国被海关扣怎么办 摩托车新买的后悔了想卖怎么办?