菜鸟的奋斗——从排序开始走进程序的世界
来源:互联网 发布:奶瓶wifi破解软件下载 编辑:程序博客网 时间:2024/05/01 23:33
今天就写个归并排序吧,简单的功能,实现整数排序,没有苛刻的测试用例。表示博客今天开张了
陆陆续续的编写,并参考了shan9liang的文章(http://blog.csdn.net/shan9liang/article/details/7533466)
#include "iostream"using namespace std;#define MAX 2147483647void merge(int vec[],int low,int mid,int high) {int n1 = mid -low +1;int n2 = high - mid;int* a = new int[n1+1];int* b = new int[n2+1];int i,j;for(i=0;i<n1;i++)a[i] = vec[low+i];for(j=0;j<n2;j++)b[j] = vec[mid+j+1];a[n1] = MAX;b[n2] = MAX;i = 0;j = 0;for(int k=low;k<=high;k++) {if(a[i]<b[j]) {vec[k] = a[i];i++;}else {vec[k] = b[j];j++;}}}void MergeSort(int vec[], int low,int high) {if(low < high) {int mid = (high +low)/2;MergeSort(vec,low,mid);MergeSort(vec,mid+1,high);merge(vec,low,mid,high);}}int main() {int vec[] = {1,3,5,2,4,6};MergeSort(vec,0,5);for(int i=0;i<6;i++) cout<<vec[i]<<' ';return 0;}
关于排序的大体分类如下图所示:
冒泡排序
(1)基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
(2)实例:
#include "iostream"using namespace std;void BubbleSort(int vec[],int n) {bool Flag = true;for(int i=n-1; i>=1 && Flag; i--) {Flag = false;for(int j=0;j<i;j++) {if(vec[j]>vec[j+1]) {Flag = true;vec[j] = vec[j] ^ vec[j+1];vec[j+1] = vec[j+1] ^ vec[j];vec[j] = vec[j] ^ vec[j+1];}}}}int main() {int a[] = {6,12,5,3,4,18};BubbleSort(a,6);for(int i=0;i<=5;i++)cout<<a[i]<<' ';cout<<endl;return 0;}
简单选择排序
(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;
然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
(2)实例:
#include <iostream>using namespace std;void SelectSort(int vec[],int n) {for(int i=0; i<n-1; i++)for(int j=i+1; j<n;j++)if(vec[i] > vec[j]) {vec[i] = vec[i] ^ vec[j];vec[j] = vec[j] ^ vec[i];vec[i] = vec[i] ^ vec[j];}}void Print(int vec[], int n) {for(int i=0; i<n; i++)cout<< vec[i]<<' ';cout<<endl;}int main() {int a[] = {12,4,5,8,21,1,3};Print(a,7);SelectSort(a,7);Print(a,7);system("pause");return 0;}
上述代码中可以发现,只要出现逆置的情况就会发生一次交换,这样的作法效率是很低的,因此可以首先检测出最小值的下标,最后进行交换。
void SelectSort(int vec[],int n) { for(int i=0; i<n-1; i++) { \int Min = i; for(int j=i+1; j<n;j++)if(vec[Min] > vec[j]) Min = j;if(Min != i){ vec[i] = vec[i] ^ vec[Min]; vec[Min] = vec[Min] ^ vec[i]; vec[i] = vec[i] ^ vec[Min]; }}}
直接插入排序
(一直对插入排序的印象极为深刻,因为在读《算法导论》的开篇就是用摸扑克牌的方法介绍插入排序,自认为很经典,举例也极为恰当)
(1)基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排
好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数
也是排好顺序的。如此反复循环,直到全部排好顺序。
(2)实例
#include <iostream>using namespace std;void InsertSort(int vec[],int n) {for(int i=1; i<=n-1; i++) {int temp = vec[i];//摸到一张扑克牌int j = i-1;while(j>=0 && vec[j]>temp) {//寻找插入位置vec[j+1] = vec[j];j--;}vec[j+1] = temp;//插入扑克牌}}void Print(int vec[], int n) {for(int i=0; i<n; i++)cout<< vec[i]<<' ';cout<<endl;}int main() {int a[] = {12,4,5,8,21,1,3};Print(a,7);InsertSort(a,7);Print(a,7);system("pause");return 0;}
快速排序
基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
#include <iostream> using namespace std; int QuickPartation(int vec[], int low, int high) {if(low < high) {int i = low - 1;int temp = vec[high];for(int j=low; j<=high-1; j++) {if(vec[j] <= temp) {i = i + 1;int m = vec[i];vec[i] = vec[j];vec[j] = m;}}vec[high] = vec[i+1];vec[i+1] = temp;return i+1;}} void QuickSort(int vec[], int low, int high) {if(low < high) {int mid = QuickPartation(vec,low,high);QuickSort(vec,low,mid-1);QuickSort(vec,mid+1, high);}}void Print(int vec[], int n) {for(int i=0; i<n; i++)cout<<vec[i]<<' ';cout<<endl;}int main() { int a[] = {12,4,5,8,21,1,13}; Print(a,7); QuickSort(a,0,6); Print(a,7); system("pause"); return 0; }
- 菜鸟的奋斗——从排序开始走进程序的世界
- 走进程序世界的田园——引导扇区释疑
- 如何走进程序的世界?
- 从画图程序开始,走进GUI编程世界
- 开始奋斗的程序媛
- 【C#——走进你的世界】
- 走进程序世界的田园——引导扇区释疑 (转载zjneter的专栏)
- 走进VR开发世界(4)——走进VR游戏开发的世界
- 从这里开始——现实世界的理性视角
- 走进博客的世界
- 走进汇编的世界
- 走进ReactiveCocoa的世界
- 走进Git的世界
- 走进递归的世界
- 走进 Redis 的世界
- 走进 Redis 的世界
- 走进 Redis 的世界
- 走进 Redis 的世界
- JPA注解
- android 之 TabHost
- linux 路由表维护
- 一个可以帮你传播这样的惊喜出现
- S40使用J2ME录音
- 菜鸟的奋斗——从排序开始走进程序的世界
- 资金应该好好利用这种投资工具
- @SuppressWarnings 详解
- Android界面基本属性
- 经点笑话
- ubuntu 安装bin 文件不能执行的问题
- James Gosling
- 巧用backtrace系列函数,在不具备gdb环境的Linux系统上大致定位段错误位置
- oracle日期时间与java日期时间对比