笔记二 排序
来源:互联网 发布:网络系统集成 编辑:程序博客网 时间:2024/06/05 14:39
#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;elseleft=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){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; }*/
0 0
- 笔记二 排序
- 算法笔记二:插入排序
- 笔记二:计数排序、选择排序、冒泡排序、插入排序
- 数据结构学习笔记(二)各种排序
- 学习笔记(二)分治排序
- 归并排序-《算法导论》学习笔记二
- C++基础笔记之二:选择排序
- 【Data_Structure笔记6】排序算法之【二路归并排序】
- 算法导论学习笔记(二):合并排序
- 学习Linux笔记(二)-常用+查找排序
- 算法学习笔记(二)字符串根据逆序排序
- Hadoop学习笔记(二):MapReduce的特性-计数器、排序
- MYSQL学习笔记(二)排序检索数据
- 排序(二)
- 排序二--堆排序
- 排序(二)-冒泡排序
- 排序(二)---希尔排序
- 排序二--堆排序
- 实战TinyXML
- xp禁止安装软件
- 转载:用Kafka实时复制PostgreSQL里的最新数据
- 我找回我自己
- android ndk 入门之打印log信息
- 笔记二 排序
- Linux命令之——Date命令详解
- 【嘟嘟工作室】 UEFI GUI 最新界面 duduworks@163.com
- MAC版photoshop CS6安装与破解
- Linux|XAMPP 搭建Discuz论坛一
- MFC学习记录
- 黑马程序员------判断语句、循环语句及break、continue
- 2015061701 - 孙武
- 第一次一年程序员面试