zoukankan      html  css  js  c++  java
  • 归并排序的非递归算法

      1 //编译运行环境:VS2012
      2 #include<iostream>
      3 #include<stdlib.h>
      4 using namespace std;
      5 int countbody = 0;
      6 //交换数组中两个元素的位置
      7 void swap(int left, int right, int sort[]){
      8 
      9     int temp;
     10     temp = sort[left];
     11     sort[left] = sort[right];
     12     sort[right] = temp;
     13 
     14 }
     15 
     16 //两个已经排好序的小数组整合成较大的数组
     17 void bodySort(int midnum, int leftstart, int rightEnd, int sort[]){
     18 
     19     
     20     for (int i = midnum; i >= leftstart; i--,midnum--)
     21     {
     22         for (int j = midnum; j < rightEnd; j++)
     23         {
     24             countbody ++;
     25             if(sort[j] > sort[j+1]) swap(j,j+1,sort);
     26             else break;
     27         }
     28 
     29     }
     30     
     31 }
     32 
     33 //归并排序进行的拆分工作
     34 void marginSort(int sortnum, int sortArray[]){
     35 
     36     int* tempSort = (int*)malloc(sortnum*sizeof(int));
     37     int tm = 0;
     38     for (int i = 0; i < sortnum-1; i++)
     39     {
     40         if(sortArray[i+1] < sortArray[i]){
     41             tempSort[tm++] = i;
     42         }
     43     }
     44     tempSort[tm++] = sortnum-1;
     45     int count = 1;
     46     /***************************************************************/
     47     cout << ""<< count++ <<"次归并:" << endl;
     48     cout << "tempSort的初始情况:" << endl;
     49     cout << "tempSort.size == " << tm << endl;
     50     for (int i = 0; i < tm; i++)
     51     {
     52         cout << "tempSort["<<i<<"]==" << tempSort[i] << " ";
     53     }
     54     cout << endl;
     55     cout << endl;
     56     /***************************************************************/
     57     
     58     while (tm != 1)
     59     {
     60         countbody = 0;
     61 
     62         cout << ""<< count++ <<"次归并:" << endl;
     63 
     64         int tmfl = tm % 2 == 0 ? tm : tm - 1;
     65         for (int i = 0; i < tmfl; i += 2)
     66         {
     67             int startNum = 0;
     68             if(i != 0)
     69                 startNum = tempSort[i-1]+1;
     70              bodySort(tempSort[i],startNum,tempSort[i+1],sortArray);
     71         }
     72         int ff = 0;
     73         
     74         for (int i = 1; i < tmfl; i += 2)
     75         {
     76             tempSort[ff++] = tempSort[i];
     77         }
     78         if((tm) % 2 != 0){
     79             
     80             tempSort[ff++] = tempSort[tm-1];
     81             
     82         }    
     83         tm = ff;
     84         /***************************************************************/
     85         cout << "比较次数:" << countbody << endl;
     86         cout << "tempSort的情况:" << endl;
     87         cout << "tempSort.size == " << tm << endl;
     88         for (int i = 0; i < tm; i++)
     89         {
     90             cout << "tempSort["<<i<<"]==" << tempSort[i] << " ";
     91         }
     92         cout << endl;
     93         cout << endl;
     94         /***************************************************************/
     95     }
     96 
     97     free(tempSort);
     98 }
     99 
    100 
    101 int main ()//函数的功能:归并排序的非递归算法
    102 {
    103 
    104     int* sortArray;
    105     int sortnum = 0;
    106     
    107     cout << "请输入要排序的元素的长度:" << endl;
    108     cin >> sortnum;
    109     sortArray = (int*)malloc(sortnum*sizeof(int));
    110     if(sortArray == NULL){
    111         cout << "不能成功分配存储空间!";
    112         exit(1);
    113     }
    114     cout << "请输入元素:" << endl;
    115     for (int i = 0; i < sortnum; i++)
    116     {
    117         cin >> sortArray[i];
    118     }
    119 
    120     marginSort(sortnum,sortArray);
    121     
    122     cout << "排序后的数组元素为:" << endl;
    123     for (int i = 0; i < sortnum; i++)
    124     {
    125         cout << sortArray[i] << " ";
    126     }
    127     free(sortArray);
    128     
    129 }
  • 相关阅读:
    我是怎么做App token认证的
    APP和服务端-架构设计(二)
    APP和服务端-架构设计(一)
    拦截和跟踪HTTP请求的主要方法及实现
    权限控制方案之——基于URL拦截
    你真的会用Retrofit2吗?Retrofit2完全教程
    科学的解决Http Token拦截器TokenInterceptor实现
    谈谈敏捷开发(转)
    Modbus TCP 示例报文
    Modbus 通信协议详解
  • 原文地址:https://www.cnblogs.com/mymint/p/4394624.html
Copyright © 2011-2022 走看看