求各位大神帮助-二分排序法的代码,有一个问题

问题描述

二分排序法的代码,有一个问题

void print(int a[], int n ,int i){

cout<<i <<":";

for(int j= 0; j<8; j++){

cout<<a[j] <<" ";

}

cout<<endl;

}

/**

  • 直接插入排序的一般形式
  • @param int dk 缩小增量,如果是直接插入排序,dk=1
  • */

void ShellInsertSort(int a[], int n, int dk)

{

for(int i= dk; i<n; ++i){

if(a[i] < a[i-dk]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入

int j = i-dk;

int x = a[i]; //复制为哨兵,即存储待排序元素

a[i] = a[i-dk]; //首先后移一个元素

while(x < a[j]){ //查找在有序表的插入位置

a[j+dk] = a[j];

j -= dk; //元素后移

        }
        a[j+dk] = x;            //插入到正确位置
    }
    print(a, n,i );
}

}

/**

  • 先按增量d(n/2,n为要排序数的个数进行希尔排序
  • */

    void shellSort(int a[], int n){

    int dk = n/2;

    while( dk >= 1 ){

    ShellInsertSort(a, n, dk);

    dk = dk/2;

    }

    }

    int main(){

    int a[8] = {3,1,5,7,2,4,9,6};

    //ShellInsertSort(a,8,1); //直接插入排序

    shellSort(a,8); //希尔插入排序

    print(a,8,8);

    }

ShellInsertSort函数内部为什么要用:j -=dk;第一次减之后不就是负数了吗?那while判断x < a[j]中不会出错吗?

解决方案

不会的,因为第一次时a[i] = a[i-dk],使得x不会小于a[j],也就不会执行while循环了

解决方案二:

这段代码执行的条件就是a[i]<a[i-dk],后面有x=a[i];j=i-dk;
那么第一次判断时,x<a[j]就可以理解为a[i]<a[i-dk],所以while语句是一定是要执行的。
我想问的是:
j -=dk;第一次减之后不就是负数了吗?那while判断x < a[j]中不会出错吗?

解决方案三:

一个排序问题

时间: 2024-12-27 01:16:21

求各位大神帮助-二分排序法的代码,有一个问题的相关文章

网页效果-领导让做一个效果不会做啊!求各位大神指点啊!

问题描述 领导让做一个效果不会做啊!求各位大神指点啊! 领导让小弟做一个微站的效果: 类似这种的:http://sla.sh.1251246865.cee.myqcloud.com/ 就是可以测试出你是什么人啊,这类的效果, 没有做过,不懂怎么做,有知道的大神吗,指点一下小弟,不胜感激 解决方案 这个需要找"神棍"之类的资料的,做应该是比较简单. 主要是找一个对应的算法.实在找不到,可以抄别人网站上的逻辑,只是要花费一些时间. 解决方案二: 主要就是自己定义一个算法,规则,然后一些数据

紧急求助-ubutun Realtek b723 无线网卡驱动 问题,求各位大神帮帮小弟

问题描述 ubutun Realtek b723 无线网卡驱动 问题,求各位大神帮帮小弟 我在ubuntu安装了一个 电脑清扫工具,不小心把无线网卡驱动卸载掉了.我的无线网卡型号是:Realtek Device b723. 我用 lspci -vnn 命令得到如下信息: 05:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. Device [10ec:b723] Subsystem: Lenovo Device [17

求各路大神解答C++找字符串并且返回

问题描述 求各路大神解答C++找字符串并且返回 编写一个程序,判定一个字符串是否为另外一个字符串的子串,若是,返回子串在主串中的位置.要求不适用strstr函数,自己编写一个子函数实现. 要求不使用strstr函数. 解决方案 #include<iostream> #include<string> #include<cstring> using namespace std; string a,b; int main() { int i,j,l,f; //输入两个字符串

java-JAVA中的排序,最近有一个工程需要排序算法,求算法大神....

问题描述 JAVA中的排序,最近有一个工程需要排序算法,求算法大神.... 就是list中有一组数据(id),要求将id按照id的一个属性(age)进行两两分组. 若是偶数:按照**age之差最小**的两个id进行分组,两两一组. 若是奇数,则将一个id轮空,剩余id仍按照 age之差最小 这一条件进行两两分组. 求大神解救.或者说说一说思路也行... 解决方案 这里面会用到哪个函数?或者大概步骤是如何的,小白求大家尽量详细点说.... 解决方案二: 给出样例数据和预期的结果. 分组也可以用数据

指针-跪求大神 c++词频 排序

问题描述 跪求大神 c++词频 排序 You say that you love rain, but you open your umbrella when it rains. You say that you love the sun, but you find a shadow spot when the sun shines. You say that you love the wind, but you close your windows when wind blows. This i

求各位大神帮忙做一下编译原理程序设计

问题描述 求各位大神帮忙做一下编译原理程序设计 1.设计词法分析器 设计各单词的状态转换图,并为不同的单词设计种别码.将词法分析器设计成供语 法分析器调用的子程序.功能包括:具备预处理功能.将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序:能够拼出语言中的各个单词:http://ask.csdn.net/#将拼出的标识符填入符号表:返回(种别码, 属性值).2.目标代码生成器c. 能完成指定寄存器个数的情况下将一中间代码程序段翻译成汇编语言目标代码(汇

series-delphi用TChart绘制lines的问题,跪求各位大神帮助

问题描述 delphi用TChart绘制lines的问题,跪求各位大神帮助 我用delphi自带的TChart控件做图表,Chart1->Series[0]->AddXY(X,Y,"",clRed);Series为line型,画图时,发现自动排序了,并不是按照我添加数据的先后顺序画图,如何避免自动排序?series[0].xvalues.order.lonone默认的还是按照x轴的大小从小到大绘图,我该如何实现按照我添加点的顺序绘图呢?跪求各位大神帮助 解决方案 这个是折线

请教大神java中排序的问题

问题描述 请教大神java中排序的问题 网上找排序的资料,有的说第一个是冒泡,有的说第二个,个人感觉第二个,但是不确定,求大神教我, public static void mySort1(int[] data){ for (int i = 0; i < data.length; i++) { for (int j = i; j < data.length; j++) { if(data[i] < data[j]) { int tmp = data[i]; data[i] = data[j

c语言-C语言学籍管理系统,我想添加专业和家庭地址的代码,求各位大神帮帮忙!小菜鸟我感激不尽啊啊啊啊

问题描述 C语言学籍管理系统,我想添加专业和家庭地址的代码,求各位大神帮帮忙!小菜鸟我感激不尽啊啊啊啊 #include #include #include #define M 2 void maininterface(); void findinterface(); void choice(long sno[], char sname[][20], int sage[], float cs[], int N); void findchoice(long sno[], char sname[][