zoukankan      html  css  js  c++  java
  • 插入排序的一个应用-调整负数在前,正数在后,原来相对位置不变

    网上看到一个程序设计面试题:大概的意思是说在一个整数数组中,将负数放在前面,将正数放在后面,要保证原来的相对顺序不能变化。

    例如:例子

    分析:当然最简单的就是用空间换时间了,再开两个相同大小的数组,顺序遍历将负数和整数放在各自数组中,最后再整合在元数组中,时间复杂度O(n)。

    觉得题目会有空间限制的,因此想办法怎么在就地进行交换来实现呢。这也是一种排序,只不过是看正负而已,相对位置不变是说的稳定性。因此联想到借鉴插入排序的思想可以解决问题,

    数组只有一个数时,则不用操作;当大于一个数时,需要遍历n-1趟,当前s[i]和前面已经排好“序”的数组,进行比较,在这里不同的是,只要是遇到正数,就往后移动。(插入递增排序是要遇到小于当前的,就往后移动);有了思路实现起来就方便~(*^__^*) ~嘻嘻

    下面给出自己实现的代码:

    void change_arry_negative_positive(int *a,int length)
    {
        int i,j,temp;
        for(i=1;i<length;i++)  //n-1趟插排
        {
            j=i;
            temp = a[i];  //记录当前点,便于恢复赋值给插入
            while(j > 0 && temp<0 && a[j-1]>0) //遇到正数,往后移动,插入前面最后负数后面
            {
                a[j] = a[j-1];
                j--;
            }
            a[j] = temp;
        }
    }
    下面也给出实现插入排序的代码:
    void dircect_insert_sort2(int *a,int length)
    {
        int i,j,temp;
        for(i=1;i<length;i++)
        {
            j=i;
            temp = a[i];
            while(j > 0 && temp < a[j-1]) //此处是边比较,边移动,注意边界
            {
                a[j]=a[j-1];
                j--;
            }
            a[j] = temp;
        }
    }
    //这个版本,第一次写,纯模拟插入排序过程,不是很优化,其实可以边比较,边移动
    void direct_insert_sort(int *s,int length)
    {
        int i,j,k,temp;
        for(i=1;i < length;i++)//需要n-1趟插排
        {
            temp = s[i];
            j=i;
            while(j>0 && temp < s[j-1])  //j临点,j+1待插入的位置,小的话,一直往前查找
                j--;
            for(k=i-1;k >=j;k--)
                s[k+1]=s[k];  //数组往后移动,必须从最后一个往后移动
            s[j] = temp;
        }
    }
  • 相关阅读:
    sql server版本、组件和管理工具
    asp.net WebService如何去掉asmx后缀
    通过C#发送自定义的html格式邮件
    asp.net上传图片到服务器
    分享一个C#自定义事件的实际应用
    推荐一个ASP.NET网站内容管理系统源码
    asp.net读取模版并写入文本文件
    Win10命令提示符(cmd)怎么复制粘贴
    配置IIS的通配符应用程序映射
    用c-free 5写一个入门的程序
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3156303.html
Copyright © 2011-2022 走看看