排序算法
来源:互联网 发布:vscode 多行注释 编辑:程序博客网 时间:2024/06/17 01:54
冒泡排序,稳定,复杂度n*n
选择排序,不稳定,复杂度n*n
不稳定:
快速排序,递归实现,不稳定,复杂度n*log(n),空间复杂度
堆排序,大小顶堆实现,不稳定,复杂度n*log(n)
稳定:
在快速排序中添加另外一个控制变量
合并排序,两个有序队列合并
1、快速排序示例
//快速排序示例#include <cstdio>#include <cstdlib>int p[50];int len;void input(){len = 20;int i;for(i = 0; i < len; ++ i)p[i] = rand() / 100;p[0] = p[1] = p[2] = 50;}void print(){int i;for(i = 0; i < len; ++ i)printf("%d ", p[i]);printf("\n");}void fsort(int l, int r)//快速排序{if(l >= r) return;int temp = p[l];int pl, pr;for(pl = l, pr = r;pl < pr;){for(;pl < pr;){if(p[pr] >= temp)pr --;elsebreak;}if(pl < pr) p[pl ++] = p[pr];for(;pl < pr;){if(p[pl] <= temp)pl ++;elsebreak;}if(pl < pr) p[pr --] = p[pl];}p[pr] = temp;fsort(l, pr - 1);fsort(pr + 1, r);}int main(){input();print();fsort(0, len - 1);print();return 0;}
2、堆排序示例
//堆排序示例#include <cstdio>#include <cstdlib>int p[50];int len;void input(){len = 25;int i;for(i = 1; i <= len; ++ i)p[i] = rand() / 100;p[1] = p[2] = 50;}void print(){int i;for(i = 1; i <= len; ++ i)printf("%d ", p[i]);printf("\n");}void swap(int x, int y){int temp = p[x];p[x] = p[y];p[y] = temp;}void fsort()//堆排序{int i;int q;for(i = len / 2; i >= 1; -- i)//小顶堆初始化{q = i;while(2 * q <= len){if(2 * q + 1 > len){if(p[q] > p[2 * q]){swap(q, 2 * q);q = 2 * q;}break;}else{if(p[2 * q] <= p[2 * q + 1]){if(p[q] > p[2 * q]){swap(q, 2 * q);q = 2 * q;}elsebreak;}else{if(p[q] > p[2 * q + 1]){swap(q, 2 * q + 1);q = 2 * q + 1;}elsebreak;}}}}int n = 1;while(n < len)//每次第一个数与最后一位数交换,这样循环len - 1遍,数组从大到小排序{swap(len - n + 1, 1);q = 1;while(2 * q < len - n + 1){if(2 * q + 1 >= len - n + 1){if(p[q] > p[2 * q]){swap(q, 2 * q);q = 2 * q;}elsebreak;}else{if(p[2 * q] <= p[2 * q + 1]){if(p[q] > p[2 * q]){swap(q, 2 * q);q = 2 * q;}elsebreak;}else{if(p[q] > p[2 * q + 1]){swap(q, 2 * q + 1);q = 2 * q + 1;}elsebreak;}}}n ++;}}int main(){input();print();fsort();print();return 0;}
3、归并排序
//归并排序示例#include <cstdio>#include <cstdlib>#include <cstring>int p[50];int _p[50];int len;void input(){len = 20;int i;for(i = 0; i < len; ++ i)_p[i] = p[i] = rand() / 100;_p[0] = p[0] = 50;_p[1] = p[1] = 50;_p[2] = p[2] = 50;}void print(){int i;for(i = 0; i < len; ++ i)printf("%d ", p[i]);printf("\n");}void fsort(int l, int r)//归并排序{if(l == r)return;int mid = (l + r) / 2;fsort(l, mid);fsort(mid + 1, r);int i, j, z;for(i = l, j = mid + 1, z = 0; i <= mid || j <= r;)//对两个有序数组进行排序{if(i > mid)_p[l + (z ++)] = p[j ++];else if(j > r)_p[l + (z ++)] = p[i ++];else{if(p[i] <= p[j])_p[l + (z ++)] = p[i ++];else_p[l + (z ++)] = p[j ++];}}//memcpy(p, _p, sizeof(_p));for(i = l; i <= r; ++ i)p[i] = _p[i];}int main(){input();print();fsort(0, len - 1);print();return 0;}
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- SCC的Tarjan算法模板
- VC获取CListCtrl的LVITEM
- ACE中ACE_Message_Queue 的notify和Reactor结合使用时会导致死锁 - [程序]
- SQLServer2008:助您轻松编写T-SQL存储过程
- Android学习进阶路线导航线路(Android源码分享)
- 排序算法
- UITextField属性设置
- 解决IE6 的 PNG透明 JS插件
- 临界区(Critical section)与互斥体(Mutex)的区别
- PSI/SI表TS包中PID的分配表
- 页面中加入<!DOCTYPE HTML>后EasyUi报错
- 三种memcached的JAVA客户端比较
- Android ListView 去除边缘阴影、选中色、拖动背景色、行高、addFootView
- ANDROID之后没有UART输出kernel log的情况