选择排序如何处理数组中的重复值?我很难在网上找到答案。
如果我有一个类似[8,4,7,3,9,3]的数组,那么选择哪个索引会选择在数组的第一次传递时选择交换?
第三个指数还是第五个指数?
答案 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!!!)
}