有n个整数,使前面各数顺序向后移动m个位置最后m个数变成最前面的m个数

来源:互联网 发布:源系统数据质量报告 编辑:程序博客网 时间:2024/05/29 08:29
#include<stdio.h>#define n 10void move(int data[] , int m){int i , t ; while(m--){t = data[n-1] ; for( i = n-1 ; i >= 1 ; i--){data[i] = data[i-1] ; }data[0] = t ;}}int main(){int i ;int arr[n]={1,2,3,4,5,6,7,8,9,10} ; move(arr , 3) ;for(i = 0 ; i < n ; i++){printf("%d  ",arr[i]) ;}return 0 ;}
上述程序中时间复杂度 为O(n*n) 想想应该还有另外的解决方案来 减少时间复杂度
其实我们可以这样做 
在移动m个时 就相当于 把前n-m 个与m个逆序了 一样 由此我们可以推算出 一个算法
把前n-m个 和m个同时逆序  然后再把他们整体逆序就得到 结果 
#include<stdio.h>#define n1 10#define m1 3void move(int data[] , int m , int n ){    int i , t ;     for(; m < n ; m++,n--)    {    t = data[n] ;     data[n] = data[m];    data[m] = t ;    }}int main(){int i ;int arr[n1]={1,2,3,4,5,6,7,8,9,10} ; move(arr, 0 , n1 -m1 -1); // 将前n-m个逆序 move(arr , n1 -m1 ,n1-1) ;  // 将后m个逆序 move(arr , 0 , n1-1) ;    //  将整体逆序 for(i = 0 ; i < n1 ; i++){printf("%d  ",arr[i]) ;}return 0 ;} 


                                             
0 0
原创粉丝点击