笔记二 排序
2015-06-17 21:25
267 查看
#include <iostream> #include <vector> using namespace std; //直接插入排序C /*void insertsort(list r,int n) { int i,j; for(i=2;i<n;++i) { r[0]=r[i]; j=i-1; while(r[0].key<r[j].key) { r[j+1]=r[j]; j--; } r[j+1]=r[0]; } }*/ //C++ int zhicha() { vector<int> shuju; int a; cout<<"请输入排序数据(以空格分隔数据 按Ctrl+Z结束输入)"<<endl; shuju.push_back(0); while(cin>>a) shuju.push_back(a); vector<int>::size_type size=shuju.size(); size-=1; vector<int>::size_type i,j; for(i=2;i<=size;++i) { shuju[0]=shuju[i]; j=i-1; while(shuju[0]<shuju[j]) { shuju[j+1]=shuju[j]; j--; } shuju[j+1]=shuju[0]; } vector<int>::iterator first=shuju.begin()+1; while(first!=shuju.end()) cout<<*(first++)<<" " ; cout<<endl; return 0; } //二分法插入排序 /* { int left,right,num,middle,j; for( int i = 1;i < data1.Length;i++) { // 准备 left = 0;right = i-1; num = data1[i]; // 二分法查找插入位置 while( right >= left) { // 指向已排序好的中间位置 middle = ( left + right ) / 2; if( num < data1[middle] ) // 插入的元素在右区间 right = middle-1; else // 插入的元素在左区间 left = middle+1; } // 后移排序码大于R[i]的记录 for( j = i-1;j >= left;j-- ) { data1[j+1] = data1[j]; } // 插入 data1[left] = num; } */ int erfencharu() { vector<int> shuju; int a,left,right,num,middle,j; cout<<"请输入排序数据(以空格分隔数据 按Ctrl+Z结束输入)"<<endl; while(cin>>a) shuju.push_back(a); vector<int>::size_type size=shuju.size(),i; for( i=1;i<size;++i) { left=0; right=i-1; num=shuju[i]; while(right>=left) { middle=(left+right)/2; if(num<shuju[middle]) right=middle-1; else left=middle+1; } for(j=i-1;j>=left;--j) { shuju[j+1]=shuju[j]; } shuju[left]=num; } //vector<int>::iterator first=shuju.begin(); //while(first!=shuju.end()) //cout<<*(first++)<<" " ; i=0; while(i<size) cout<<shuju[i++]<<" "; cout<<endl; return 0; } //希尔排序 不稳定排序 /* void shellsort1(int a[], int n) { int i, j, gap; for (gap = n / 2; gap > 0; gap /= 2) //步长 for (i = 0; i < gap; i++) //直接插入排序 { for (j = i + gap; j < n; j += gap) if (a[j] < a[j - gap]) { int temp = a[j]; int k = j - gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } } } 很明显,上面的shellsort1代码虽然对直观的理解希尔排序有帮助,但代码量太大了,不够简洁清晰。因此进行下改进和优化,以第二次排序为例,原来是每次从1A到1E,从2A到2E,可以改成从1B开始,先和1A比较,然后取2B与2A比较,再取1C与前面自己组内的数据比较…….。这种每次从数组第gap个元素开始,每个元素与自己组内的数据进行直接插入排序显然也是正确的 ////// void shellsort2(int a[], int n) { int j, gap; for (gap = n / 2; gap > 0; gap /= 2) for (j = gap; j < n; j++)//从数组第gap个元素开始 if (a[j] < a[j - gap])//每个元素与自己组内的数据进行直接插入排序 { int temp = a[j]; int k = j - gap; while (k >= 0 && a[k] > temp) { 4000 a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } } void shellsort3(int a[], int n) { int i, j, gap; for (gap = n / 2; gap > 0; gap /= 2) for (i = gap; i < n; i++) for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap) Swap(a[j], a[j + gap]); } */ //冒泡排序 int maopao() { vector<int> shuju; int a,j,temp; cout<<"请输入排序数据(以空格分隔数据 按Ctrl+Z结束输入)"<<endl; while(cin>>a) shuju.push_back(a); vector<int>::size_type size=shuju.size(),i; for(j=0;j<size-1;++j) for(i=0;i<size-1-j;++i) { if(shuju[i]>shuju[i+1]) { temp=shuju[i]; shuju[i]=shuju[i+1]; shuju[i+1]=temp; } } i=0; while(i<size) cout<<shuju[i++]<<" "; cout<<endl; return 0; } //快速排序 不稳定 /* //快速排序 void quick_sort(int s[], int l, int r) { if (l < r) { //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1 int i = l, j = r, x = s[l]; while (i < j) { while(i < j && s[j] >= x) // 从右向左找第一个小于x的数 j--; if(i < j) s[i++] = s[j]; while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数 i++; if(i < j) s[j--] = s[i]; } s[i] = x; quick_sort(s, l, i - 1); // 递归调用 quick_sort(s, i + 1, r); } } int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置 { int i = l, j = r; int x = s[l]; //s[l]即s[i]就是第一个坑 while (i < j) { // 从右向左找小于x的数来填s[i] while(i < j && s[j] >= x) j--; if(i < j) { s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑 i++; } // 从左向右找大于或等于x的数来填s[j] while(i < j && s[i] < x) i++; if(i < j) { s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑 j--; } } //退出时,i等于j。将x填到这个坑中。 s[i] = x; return i; } void quick_sort1(int s[], int l, int r) { if (l < r) { int i = AdjustArray(s, l, r);//先成挖坑填数法调整s[] quick_sort1(s, l, i - 1); // 递归调用 quick_sort1(s, i + 1, r); } } */ //直接选择排序 不稳定 //树形选择排序 //堆排序 不稳定 //并归排序 int main() { //zhicha();//直插排序 //erfencharu();//二分插入排序 maopao();//冒泡排序 system("pause"); return 0; } /* /二叉树链式存储的实现 #include<iostream> #include<cstring> using namespace std; struct ECS_data //先定义好一个数据的结构 { char data; ECS_data *l; ECS_data *r; }; class ECS { private: //int level; //树高 int n; //表示有多少个节点数 int n1; //表示的是数组的总长度值,(包括#),因为后面要进行删除判断 ECS_data *temp[1000]; public: ECS_data *root; ECS() //初始化 { ECS_data *p; char t[1000];int i; int front=0,rear=1; //front表示有多少个节点,rear表示当前插入的点的父母 cout<<"请按正确顺序输入二叉树的数据:"; cin.getline(t,1000); //先把输入的数据输入到一个t数组 //cout<<t<<" "<<endl; int n1=strlen(t); //测量数据的长度 n=0; for(i=0;i<n1;i++) { if(t[i]!='#') { p=NULL; if(t[i]!=',') //满足条件并开辟内存 { n++; p=new ECS_data; p->data=t[i]; p->l=NULL; p->r=NULL; } front++; temp[front]=p; if(1 == front){root=p;} else { if((p!=NULL)&&(0==front%2)) { temp[rear]->l=p;//刚开始把这里写成了== } if((p!=NULL)&&(1==front%2)) { temp[rear]->r=p; } if(1==front%2)rear++; //就当前的数据找这个数据的父母 } } } } ~ECS() //释放内存 { int i; for(i=1;i<=n;i++) if(temp[i]!=NULL) delete temp[i]; } void JS() //记录节点的个数 { int s; s=n; cout<<"该二叉树的节点数为:"<<s<<endl; } void BL1(ECS_data *t)//先序遍历 { if(NULL!=t) { cout<<t->data<<","; BL1(t->l); BL1(t->r); } } void BL2(ECS_data *t)//中序遍历 { if(NULL!=t) { BL2(t->l); cout<<t->data<<","; BL2(t->r); } } void BL3(ECS_data *t)//后续遍历 { if(NULL!=t) { BL3(t->l); BL3(t->r); cout<<t->data<<","; } } }; int main() { ECS a; a.JS(); a.BL1(a.root); cout<<endl; a.BL2(a.root); cout<<endl; a.BL3(a.root); cout<<endl; return 0; } */
相关文章推荐
- 转载:用Kafka实时复制PostgreSQL里的最新数据
- android ndk 入门之打印log信息
- 我找回我自己
- LeetCode—Reverse Linked List—C++
- 实战TinyXML
- 第三章:Android之NDK的使用
- 《浪潮之巅》阅读笔记之三
- 2015年6月17日-总结
- Uva - 11059 - Maximum Product
- 我不在乎别人的笑
- Uva - 11059 - Maximum Product
- Mark--application
- C++ TinyXml操作(含源码下载)
- [SaltStack] Multi-Master配置
- 对其他组的评价的反馈
- CTime与COleDateTime的常用操作和比较
- POJ1125 求有向图中两点的最短路径问题
- Struts2之Action详解
- 学生成绩管理系统
- 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加), 几个数相加有键盘控制。