zoukankan      html  css  js  c++  java
  • 13--输入一个整数数组,实现一个函数来调整数组中数字的顺序

    /*
        题目:输入一个整数数组,实现一个函数来调整数组中数字的顺序。
        使得所有奇数数字位于数组的前半部分,所有的偶数在数组的后半部分。
    
    解题思路:
    
        (1):遍历数组。类似于排序。
            找到一个偶数,就将偶数放倒最后,然后向前移动数组,复杂度O(n*n),比较缓慢。
    
        (2):类似快速排序的处理方式。前后放置2个指针。
            前面指针向后,后面指针向前,如果同时发现奇数和偶数,就交换。
            停止条件,后面的指针超越前面的指针。
        
        
    */
    
    #include <stdio.h>
    
    //移动数组,从location移动到末尾,而后依次补齐。
    void moveArray(int *num, int location, int length)
    {
        if (num == NULL || location < 0 || length < 0 || location >= length)
            return;
    
        int temp = num[location];
        for (int i = location; i < length - 1; i++)
        {
            num[i] = num[i + 1];
        }
        num[length - 1] = temp;
    }
    
    //第一种,循环移动
    void firstOrderArray(int *num, int length)
    {
        if (num == NULL || length <= 1)
            return ;
    
        for (int i = 0; i < length; i++)
        {
                if (0 == num[i]%2)
                {
                    //printf("moveArray -- %d
    ", i);
                    moveArray(num, i, length);
                }
        }
    }
    
    
    int testNum = 0;
    //第二种,快速排序的方式进行交换位置。
    void secondOrderArray(int *num, int length)
    {
        if (num == NULL || length <= 1)
            return;
    
        testNum = 0;
        int *np_start = num, *np_end = num + length - 1;
        while (np_start < np_end)
        {
            testNum++;
            //向后移动np_start,直到它指向偶数
            //*np_start & 0x1 != 0 , 证明是
            while (np_start < np_end && (*np_start & 0x1) != 0)
                np_start++;
    
            while (np_start < np_end && (*np_start & 0x1) == 0)
                np_end--;
    
            if (np_start < np_end)
            {
                int temp = *np_end;
                *np_end = *np_start;
                *np_start = *np_end;
            }
        }
    
        printf("testNum === %d
    ", testNum);
    }
    
    
    //打印数组
    void PrintArray(int *num, int length)
    {    
        for (int i = 0; i < length; i++)
            printf("%d  
    ", num[i]);
        printf("
    ");
    }
    
    //测试1
    void testOne(int *num, int length)
    {
        printf("%d
    ", length);
        firstOrderArray(num, length);
        PrintArray(num, length);
        printf ("================
    ");
    }
    
    
    //测试2
    void testTwo(int *num, int length)
    {
        //printf("%d
    ", length);
        secondOrderArray(num, length);
        PrintArray(num, length);
        printf ("================
    ");
    }
    
    
    void testFirst()
    {
        int num1[] = {1,2,3,4,5,6,7,8,9,10};
        int length1 = sizeof(num1)/sizeof(int);
        testOne(num1, length1);
    
    
        int *num2 = NULL;
        if (num2 != NULL)
        {
            int length2 = sizeof(num2)/sizeof(int);
            testOne(num2, length1);
        }
    
        int num3[] = {7};
        int length3 = sizeof(num3)/sizeof(int);
        testOne(num3, length3);
    }
    
    
    void testSecond()
    {
        int num1[] = {1,2,3,4,5,6,7,8,9,10};
        int length1 = sizeof(num1)/sizeof(int);
        testTwo(num1, length1);
    
    
        int *num2 = NULL;
        if (num2 != NULL)
        {
            int length2 = sizeof(num2)/sizeof(int);
            testTwo(num2, length1);
        }
    
    
        int num3[] = {7};
        int length3 = sizeof(num3)/sizeof(int);
        testTwo(num3, length3);
    }
    
    int main()
    {    
    
        // testFirst();
        testSecond();
    
        return 0;
    }
  • 相关阅读:
    ORM版,学生信息管理单表查询..
    回顾
    连接不上数据库
    CI缓存文件的处理和显示 研究
    php的两个符号@和&---php总会要知道的系列
    form 表单
    CI 目录下放置index.html,防止直接访问
    程序员必须知道的10大基础实用算法及其讲解
    memached 服务器lru算法
    centos 5.5 安装 lnmp
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4842557.html
Copyright © 2011-2022 走看看