笔记二 排序

来源:互联网 发布:网络系统集成 编辑:程序博客网 时间: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
原创粉丝点击