数据结构与算法练习-排序

调整数组顺序使奇数位于偶数前面

描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

分析

  • 这里很容易联想到快速排序基于中间值,左右两边基本有序的方法。但是快速排序是一个不稳定算法,会改变数与数之间的位置,虽然能满足题干的前半部分,但是满足不了条件—并保证奇数和奇数,偶数和偶数之间的相对位置不变。
  • 考虑其他的排序方法中,维持一个队列有序的稳定排序方法—插入排序

代码

//这是一个错误的解决方式,使用快速排序
public static void reOrderArrayError(int[] array) {
        if (array == null || array.length == 0 || array.length == 1) {
            return;
        }
        int temp = array[0];
        int i = 0, j = array.length - 1;
        while (i < j) {
            while (i < j && array[i] % 2 == 1) {
                i++;
            }
            if (i < j) {
                array[j] = array[i];
            }
            while (i < j && array[j] % 2 == 0) {
                j--;
            }
            if (i < j) {
                array[i] = array[j];
            }

        }
        array[i] = temp;
    }

//插入排序
    public static void reOrderArray(int[] array) {
        if (array == null || array.length == 0 || array.length == 1) {
            return;
        }
        for (int i = 0; i < array.length; i++) {
            if (array[i] % 2 == 1) {
                int j = i - 1;
                int temp = array[i];
                while (j >= 0 && array[j] % 2 == 0) {
                    array[j + 1] = array[j];
                    j--;
                }
                array[j+1] = temp;
            }
        }

测试

public void testReOrderArray() {
        int[] array = { 1, 2, 3, 4, 5, 6, 7 };
        int[] curArray = { 1, 3, 5, 7, 2, 4, 6 };
        Number.reOrderArray(array);
        for (int i = 0; i < array.length; i++) {
            assertEquals(array[i], curArray[i]);
            // Log.d("TAG", array[i]+" ");
        }
    }
时间: 2024-08-25 19:43:21

数据结构与算法练习-排序的相关文章

Java数据结构与算法之排序

排序从大体上来讲,做了两件事情: 1.比较两个数据项: 2.交换两个数据项,或复制其中一项 一.冒泡排序 大O表示法:交换次数和比较次数都为O(N*N). 算法原理: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所有的元素重复以上的步骤,除了最后一个. 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. /** * 冒泡排序 demo * */

在Object-C中学习数据结构与算法之排序算法

笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 总结与收获 参考与阅读 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n2) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧. 1.算法步骤 首先在未排序序列中找到最小(大)元素,存放到排

python 数据结构与算法之排序(冒泡,选择,插入)

目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 计算机重要的几门课: 1.数据结构和算法 2.网络 3.操作系统 4.计算组成原理 数据结构与算法: 算法: 衡量算法的标准: 时间复杂度:就是程序代码执行的大概次数 小结: 时间复杂度是用来估计算法运行时间的一个式子(单位) 一般来说,时间复杂度高的算法比复杂度低的算法慢 常见的

数据结构和算法之排序一:归并排序

我们不得不承认一个事实,java学习过程中如果我们掌握了各种编程手段和工具,确实可以做一些开发,这就是一些培训机构敢告诉你几个月就能掌握一门语言的原因.但是随着时间的发展,我们总会感觉,这一类人如果不提升自己,最后也只会是一个码农.技术会日新月异,随时在发展更新换代,但是这几十年,有谁说过算法会过时,如果我们说java语言的发动机是各种开发手段和技术,那么我们可以毫不客气的说算法会是他的灵魂.一个程序员的提升和拔高一定是万丈高楼平地起,那么我希望这个地基一定是数据结构和算法,掌握这些原理以后其实

数据结构和算法之排序六:希尔排序

经过前面五篇排序方法的介绍,我们了解到了递归思想以及分而治之的归并和快速排序,当然也涉及到了比较简单易懂的数据值传递冒泡,选择,以及插入排序.可以说每一种排序方式都各有千秋,都适合在不同的环境下进行使用,但是我们有时会不会思考一个问题,那就是我们在学习插入排序的时候的主题思想是将每一个数据取出来,然后和后边的前边的数据逐一进行比较,那么,我们是不是要进行N-1次的循环,或者说我们是不是要进行大约N的平方次比较,我们知道,在进行值的交换和比较是非常消耗时间的,那么是不是违背了我们算法的发展.有没有

javascript数据结构与算法--高级排序算法

高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法---- 希尔排序和快速排序. 一:希尔排序: 希尔排序的核心理念是:首先比较距离较远的元素,而非相邻的元素. 基本原理:通过定义一个间隔序列来表示在排序过程中进行比较的元素之间有多远的间隔. 下面我们来看看数组[0,9,1,8,7,6,2,3,5,4] 来使用希尔排序的原理:如下图: 代码分析如下: 1. 执行 "间隔序列=3的步骤" A.

[数据结构与算法]常用排序算法分析与实现:第一部分

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4289903.html 插入排序 直接插入排序.希尔排序 选择排序 简单选择排序.堆排序 交换排序 冒泡排序.快速排序 归并排序 基数排序 排序基类 1 package sort; 2 3 import java.util.Arrays; 4

数据结构和算法--6排序算法

1.排序的分类 1) 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序 2) 外部排序:无法全部加载到内存中,需要借助外部存储进行 3)图示: 2.算法的时间复杂度 1)  度量一个程序(算法)执行时间的两种方法 A.事后统计的方法 问题:a.需要实际运行该程序.b.时间也依赖于计算机的硬件,软件等环境因素.所以要在同一台计算机的相同状态下运行,才能比较哪个算法速度更快 B.事前估算的方法 通过分分析某个算法的时间复杂度来判断哪个算法更优 2)  时间频度 A. 基本介绍 一个算法花

数据结构与算法:排序

排序问题一直是计算机技术研究的重要问题,排序算法的好坏直接影响程序的执行速度和辅助存储空间的占有量,所以各大IT企业在笔试面试中也经常出现有关排序的题目.本节详细分析常见的各种排序算法,并从时间复杂度.空间复杂度.适用情况等多个方面对它们进行综合比较. 选择排序 插入排序 冒泡排序 双向冒泡排序 如何进行归并排序 快速排序 希尔排序 堆排序 各种排序算法有什么优劣 选择排序 选择排序是一种简单直观的排序算法,基本原理如下:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记

javascript数据结构与算法--基本排序算法分析

javascript中的基本排序算法 对计算机中存储的数据执行的两种最常见操作是排序和检索,排序和检索算法对于前端开发尤其重要,对此我会对这两种算法做深入的研究,而不会和书上一样只是会贴代码而已,下面我会一步步从自己的理解的思路来一步步学习各个排序的思想.不过这些算法依赖于javascript中的数组来存储数据.最后我会来测试下基本算法(冒泡排序,选择排序,插入排序)的那个效率更高! 下面啊,我们先可以来封装常规数组操作的函数,比如:插入新数据,显示数组数据,还有交换数组元素等操作来调用不同的排