具有重复项的选择排序行为

时间:2016-05-07 20:46:03

标签: algorithm sorting computer-science selection-sort

选择排序如何处理数组中的重复值?我很难在网上找到答案。

如果我有一个类似[8,4,7,3,9,3]的数组,那么选择哪个索引会选择在数组的第一次传递时选择交换?

第三个指数还是第五个指数?

2 个答案:

答案 0 :(得分:0)

虽然您在3中交换的具体问题很容易回答,但更通用的版本并不容易,因为选择排序不是稳定

经典实现会在第三个索引处选择3,因为选择要交换的下一个元素的条件是

if (a[i] < a[iMin])

将第一个3换成位置0后,将不会选择索引为5的第二个3

条件意味着将根据算法当前通过之前的排列选择最早的副本。但是,这种安排可能与元素的初始排列不同。

就选择过程的进一步重复而言,没有保证,因为可以在它们之前交换较小的数字。

例如,在这个初始安排中

[3, 3, 1]

最后会选择索引为零的3,因为第一次迭代会将它一直移动到数组的末尾。

答案 1 :(得分:0)

它取决于实现。 但是,通常情况下,循环将从左向右开始扫描并获得第一个procedure SelectionSort(a: list to sorts); for i = 1 to n - 1 posmin ← i for j = (i + 1) to n if a[j] < a[posmin] posmin ← j tmp ← a[i] a[i] ← a[posmin] a[posmin] ← tmp

但我怎么说thare不是标准。

根据Wikipedia

,这是一种可能的实施方式
public int return_order(string product_name)
{
    FileStream f1 = new FileStream("name.txt", FileMode.Open);
    StreamReader r1 = new StreamReader(f1);
    string name = r1.ReadLine();
    r1.Close();
    SqlConnection s = new SqlConnection("Data Source=(local);Initial Catalog=ShoppingOnline;Integrated Security=True");
    s.Open();
    SqlCommand d = new SqlCommand("Select * from Products where ProductName ='" + product_name + "'", s);
    SqlDataReader dr;
    dr = d.ExecuteReader();
    int i = 0;
    while (dr.Read())
    {
        i += 1;
    }
    dr.Close();
    if (i == 1)
    {
        Form3 f = new Form3();
        SqlCommand cmd = new SqlCommand("UPDATE Products SET Quantity = Quantity + 1 WHERE ProductName= @username ", s);
        cmd.Parameters.AddWithValue("@username", product_name);
        cmd.ExecuteNonQuery();

        return 555; //you had no value!!!
    }

    DateTime today = DateTime.Today;
    DateTime startdate = DateTime.UtcNow.Date;
    FileStream f = new FileStream("bill.txt", FileMode.Open);
    StreamReader r = new StreamReader(f);
    string q = r.ReadToEnd();
    string w = "";

    if (!q.Contains(product_name))
        return 2; //wrong

    while (r.ReadLine() != "EOO")
    {
        f.Position = 0;
        r.DiscardBufferedData();
        string enddate = r.ReadLine();
        f.Position = 0;
        r.DiscardBufferedData();
        while (r.Peek() != -1)
        {
            DateTime dt = Convert.ToDateTime(enddate);
            DateTime dt2 = Convert.ToDateTime(startdate);

            if ((dt2 - dt.Date).TotalDays >= 14)
                return -1; //late

            string temp = r.ReadLine();
            if (temp == "Customer Name: " + name + "")
            {
                string record = r.ReadLine();
                string[] fields = record.Split('@');
                if (fields[0] == product_name)
                {
                    w = fields[1];
                    SqlCommand cmd = new SqlCommand("insert into Products(ProductName,Price,Quantity) values('" + product_name + "','" + w + "','" + 1 + "')", s);
                    cmd.ExecuteNonQuery();
                    return 1;
                }
            }
        }
        r.Close();
    }
    return 555; //some default value (you had no value!!!)
}