是否可以使用原始sort()方法对算法中的数组进行排序?

时间:2016-06-24 06:15:13

标签: javascript arrays algorithm sorting

我想知道我是否可以像这样排序这个数组:

[ 0 ,3, 1, 4, 0 ] =>   [ 1, 3, 4, 0, 0] 

详细规则:

  • 数组包含0和正数。
  • 所有0都在最后。
  • 所有正数都按升序排序。

一开始,我使用了js的原始排序功能,例如:

[0, 3, 1, 4, 0].sort(function(previous_value, former_value){
  if(previous_value == 0 && former_value != 0 ) {
      return 1;
    }else if (former_value == 0 && former_value != 0) {
      return -1;
    }else if (former_value == 0 && former_value == 0) {
      return 0;
    }else{
      return previous_value - former_value;
  }
})

然而,我失败了。我想知道是否可以实现"我的排序算法"使用sort函数? e.g:

[0, 3, 1, 4, 0].sort(function(previous_value, former_value){
    //code goes here
})

它会得到正确答案:

[1, 3, 4, 0, 0]

4 个答案:

答案 0 :(得分:3)

0置于更高优先级

console.log(
  [0, 3, 1, 4, 0].sort(function(a, b) {
    return a === b ? 0 : (a === 0 ? 1 : (b === 0 ? -1 : a - b));
  })
);

扩展if条件

console.log(
  [0, 3, 1, 4, 0].sort(function(a, b) {
    if (a === b)
      return 0;
    if (a === 0)
      return 1;
    if (b === 0)
      return -1;
    return a - b;
  })
);

答案 1 :(得分:2)

您只需强制比较器将0视为最高数字。

protected void btn4getPwd_Click(object sender, EventArgs e)
{
    if (txtusername.Text.Trim() != "")
    {
        em.username = txtusername.Text.Trim();
        DataTable forget = em.getdetailss(10);
        string passwd = (forget.Rows[0]["PassCode"].ToString());


        try
        {
            string Subject = "Your NLS Password";
            string Body = passwd;
            string ToEmail = txtusername.Text.Trim();
            string SMTPUser = "mymail@gmail.com", SMTPPassword = "pswd";

            MailMessage mail = new MailMessage();
            mail.From = new MailAddress(SMTPUser, "AspnetO");
            mail.To.Add(ToEmail);
            mail.Body = Body;
            mail.IsBodyHtml = true;
            mail.Priority = MailPriority.Normal;
            SmtpClient smtp = new SmtpClient();
            smtp.Host = "smtp.gmail.com";
            smtp.Port = 25; 
            smtp.Credentials = new System.Net.NetworkCredential(SMTPUser, SMTPPassword);
            smtp.EnableSsl = true;
            smtp.Send(mail);
            Response.Write("<script language=javascript>alert('Mail send...!! ')</script>");
        }

        catch (SmtpException ex)
        {
            lbl4get.Text = "SmtpException ";
        }
        catch (Exception ex)
        {
            lbl4get.Text = "Exception";
        }
    }
    else { Response.Write("<script language=javascript>alert('Invalid USERNAME...!! ')</script>"); }

}  

现在你只做function compareNumbers(a, b) { if (a === 0) { return 1; } if (b === 0) { return -1; } return a - b; }

只是因为它被标记为标记,我想说如果你希望你的数组很大并且有大量的零,那么创建一个非零元素的较小数组可能是有意义的,排序它并用原始长度附加零。

答案 2 :(得分:1)

虽然您已经有了解决方案,但可以使用logical OR运算符作为假值(如0)并为其指定默认值(如Infinity)。

这会将零移到最后,因为默认值大于所有其他值。

&#13;
&#13;
var array = [ 0 ,3, 1, 4, 0 ];

array.sort(function (a,b) {
    return (a || Infinity) - (b || Infinity);
});

console.log(array);
&#13;
&#13;
&#13;

答案 3 :(得分:1)

这将是我的逻辑短路解决方案

&#13;
&#13;
var a = [0, 3, 1, 4, 0].sort((a,b) => !a && 1 || !b && -1 || a-b);
console.log(a);
&#13;
&#13;
&#13;