各种排序算法的实现
来源:互联网 发布:手机怎么申请淘宝卖家 编辑:程序博客网 时间:2024/04/19 20:51
首先定义个模版函数来计算数组长度:
//获取数组的长度template <class T>int getlenth(T & arry){return (sizeof(arry)/sizeof(arry[0]));}
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,
冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
冒泡法:
这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: 复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。
直接插入排序:O(n*n)
选择排序:O(n*n)
快速排序:平均时间复杂度log2(n)*n,所有内部排序方法中最高好的,大多数情况下总是最好的。
归并排序:log2(n)*n
堆排序:log2(n)*n
希尔排序:算法的复杂度为n的1.2次幂
冒泡算法实现代码:
void popsort() //冒泡排序 时间复杂度 o(n^2){int array[]={23,234,4,34,3,23,45};//定义一个长度为7的数组int len = getlenth(array);//长度为7int temp;//临时变量cout<<"排序前";for(int i = 0 ; i < len ; i++){cout<<array[i]<<" ";}cout<<endl;//采用冒泡排序对它进行排序for(int i = 0 ; i < len - 1; i++)for(int j = 0 ; j <len - i - 1;j++){if(array[j]>array[j+1]) //判断两个相邻的元素的大小{temp = array[j]; array[j]=array[j+1];array[j+1] = temp; //将较大的元素赋值给下一个位置}}cout<<"排序后";for(int i = 0 ; i < len ; i++){cout<<array[i]<<" ";}}
希尔排序实现:
void shellsort() //希尔排序 不稳定排序{int a[]={12,3,4,41,43,343,454,34,34,2,32,34,25,3,4};int len = getlenth(a);int distence = len;do {distence = distence/2;for (int i = distence ; i <len ;i++){int j = i-distence; //两个数中第一个数的下标int temp = a[i];//待交换的数while(j>=0 && a[j]>temp) //比较两个数{a[distence+j] = a[j]; //像后移动数据j -= distence; //这里是分成几段的时候调用}if (j != i - distence) //存在比其小的数 a[j+distence] = temp; }} while (distence>1);for (int i = 0 ; i <len ; i ++){cout<<a[i] <<" ";}//cout<<len;}
/************************************************************************//* 快速排序 时间复杂度 o(n*log(n)) *//************************************************************************/void QuickSort(int a[],int numsize)//a是整形数组,numsize是元素个数{int i=0; //第一个开始的下标int j =numsize-1;//最后一个下标int val=a[0];//指定参考值val大小if(numsize>1)//确保数组长度至少为2,否则无需排序{while(i<j)//循环结束条件{for(;j>i;j--)//从后向前搜索比val小的元素,找到后填到a[i]中并跳出循环if(a[j]<val){a[i]=a[j];break;}for(;i<j;i++)//从前往后搜索比val大的元素,找到后填到a[j]中并跳出循环if(a[i]>val){a[j]=a[i];break;}}a[i]=val;//将保存在val中的数放到a[i]中QuickSort(a,i);//递归,对前i个数排序QuickSort(a+i+1,numsize-1-i);//对i+1到numsize这numsize-1-i个数排序}}
快排的另外一种写法
int myparton(int a[],int low,int hight ){int key = a[low];//将第一个记录为keywhile(low<hight){while (low<hight&&key>a[hight])hight--;if (low<hight){a[low] = a[hight];low++;}while (low<hight&&key<a[low])low++;if (low<hight){a[hight] = a[low];hight--;}}a[low] = key;return low;}void myQucksort(int a[],int low,int hight){if (low < hight){int hub = myparton(a,low,hight);myQucksort(a,low,hub-1);myQucksort(a,hub+1,hight);}}
/************************************************************************//* 二分找碴 对已经排序好的数查找 *//************************************************************************/template <class Type>Type BinarySeach(Type serch[],Type x,int len){int left = 0 ; int right = len - 1;while (left<right){int mid = (left+right)/2;if(x == serch[mid])return mid;if (x > serch[mid]){left = mid+1;}else{right = mid-1;}}}
/************************************************************************//* 选择排序 时间复杂读o(n^2) 不稳定排序 *//************************************************************************/void sortchoose(){int s[]={12,23,4,54};int len = getlenth(s);for (int i = 0 ; i < len - 1 ; i++){int min = i;for (int j = i+1; j < len ; j++){if (s[min] > s[j]) //找茬剩下的最大的下标{min = j ;}}if (min != i){s[min] = s[min]^s[i];s[i] = s[min]^s[i];s[min] = s[min]^s[i];}}for (int i = 0 ; i < len ; i ++){printf("%d\t",s[i]);}}
/***插入排序 时间复杂度o(n^2) 稳定*/void insertSort(){int s[]={12,23,4,54};int len = getlenth(s);for(int i = 2; i <len; i++){int j = 0; while(j<len&& s[j]<s[i]) //找茬插入位置j++;if(j < i) //i位置之前,有比s[i]大的数,则进行挪动和插入 {int k = i; //挪动前面的往后面挪动int temp = s[i]; while (k > j) //挪动位置 { s[k] = s[k-1]; k--; } s[k] = temp; //插入 }}for (int i = 0 ; i < len ; i ++){printf("%d\t",s[i]);}}
0 0
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法实现
- 各种排序算法实现
- 各种排序算法实现
- 各种排序算法的java实现
- 各种排序算法的C实现
- 各种排序算法的C实现(转载)
- 各种排序算法的具体实现
- 各种常见的排序算法及其实现
- 各种常见的排序算法及其实现 .
- 各种内排序算法的C++实现
- nerd
- linux进程管理与SELinux
- C语言位字段
- iOS6和iOS7代码的适配(1)
- ssh框架搭建配置文件的配置以及所需jar包
- 各种排序算法的实现
- Android 手势识别
- Pig源码分析: 逻辑执行计划模块
- 简单适配3.5寸,4寸iPhone屏幕的方法
- 中文搜索引擎之文本分类
- IO流
- C# const
- UVA 10012 - How Big Is It 暴力 回溯 全排列
- 关于自定义tabbar解决maincontroller加载多个subcontroller而导致内存不足的解决方法