美文网首页
22_调整数组顺序是奇数位于偶数前面

22_调整数组顺序是奇数位于偶数前面

作者: 是新来的啊强呀 | 来源:发表于2020-05-19 23:40 被阅读0次

    要求:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有技术位于数组的前半部分,所有偶数位于数组的后半部分。

    思路:
      法一:不稳定(类似快速排序):定义两个指针,指向数组的头部和尾部,head遇到奇数往后移动,tail遇到偶数往前移动, 如果head指向偶数,tail指向奇数,则互换,直到head=tail,退出循环
      法二:稳定(插入排序思想):外层for循环设定指针i从头遍历数组,每次判断i指针所指的值是否为奇数,内层while循环设定j指针往前遍历,将j所指奇数往前移动,直到移动到前方都是奇数的K位置。

    public class L22_ReorderOddEven {
        // 方法一
        public static void ReorderOddEven(int[] list){
            // 检查边界
            if(list==null || list.length==0){
                return;
            }
            // 定义两个指针,指向数组的头部和尾部
            int head=0;
            int tail=list.length-1;
            // head往后移动,tail往前移动,直到head=tail,退出循环
            while(head<tail){
                int temp = 0;
                // 如果head指向的数为奇数,则head往后移
                if(head<tail&&list[head]%2!=0){
                    head++;
                }
                // 如果tail指向的数为偶数,则head往前移
                if(head<tail&&list[tail]%2==0){
                    tail--;
                }
                // 如果head指向偶数,tail指向奇数,则互换
                if(list[head]%2==0 && list[tail]%2 !=0){
                    temp = list[head];
                    list[head] = list[tail];
                    list[tail] = temp;
                    head++;
                    tail--;
                }
            }
        }
        // 方法二
        public static void ReorderOddEven1(int[] arr){
            // 类似插入排序的方法
            if(arr==null||arr.length==0){
                return;
            }
            int k=0; // 用来记录摆好位子的奇数个数
            for(int i=0; i<arr.length; i++){
                if (arr[i] % 2 == 1) {
                    int j = i;
                    while (j > k) {//j >= k+1
                        // 交换
                        int tmp = arr[j];
                        arr[j] = arr[j-1];
                        arr[j-1] = tmp;
                        j--;
                    }
                    k++;
                }
            }
        }
        // 插入排序
        public static void InsertSort(int[] arr){
            //从第二个位置,即下标为1的元素开始向前插入
            for(int i=1; i<arr.length;i++){
                // 从第i个元素开始向前比较,如果小于前一个元素,交换位置
                for(int j=i; j>0; j--){
                    if(arr[j]<arr[j-1]){
                        // 交换
                        int tmp = arr[j];
                        arr[j] = arr[j-1];
                        arr[j-1] = tmp;
                    }
                }
            }
        }
      // 快速排序
      public static void quickSort(int[] arr,int left, int right) {
            if(left>right){
                return;
            }
            int middle_value = arr[left];   // 先设定一个基准元素
            int hight = right;
            int low = left;
            while(low<hight){
                // 顺序很重要,先从右边开始往左找,直到找到比middel值小的数
                while(arr[hight]>=middle_value && low<hight){
                    hight--;
                }
                // 此时找到了比middle_值小的数,把小的数放到前面
                arr[low] = arr[hight];
                // # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
                while(arr[low]<middle_value && low<hight){
                    low++;
                }
                // 此时找到了比middle_值大的数,把大的数放到后面
                arr[hight] = arr[low];
            }
            // 当退出循环,大于midde_value的在右,小于middLe_value的在左
            // 此时low与hight重合
            arr[low] = middle_value;
            // 把小于基准值元素的子数列和大于基准值元素的子数列排序。
            quickSort(arr,left,low-1);
            quickSort(arr,low+1,right);
        }
    
    
        public static void main(String[] args) {
            int[] arr= {2,4,5,23,1,3};
    //        InsertSort(arr);
            ReorderOddEven1(arr);
            for(int i=0; i<arr.length; i++){
                System.out.println(arr[i]);
            }
        }
    }
    

    快速排序:
    快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
    步骤为:
    1、从数列中挑出一个元素,称为"基准"(pivot),
    2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
    3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
    递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
    最坏时间复杂度:O(n^2)
    稳定性:不稳定

    插入排序:
    插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
    最坏时间复杂度:O(n^2)
    稳定性:稳定

    相关文章

      网友评论

          本文标题:22_调整数组顺序是奇数位于偶数前面

          本文链接:https://www.haomeiwen.com/subject/fljwohtx.html