求一个算法
我这里需要做一个发票报销和单号有关的分摊功能
场景:发票张数是n,报销单号是m,发票的金额和报销单号的金额一定是一致的,现在要进行分摊,比如五张发票对应三个单号,总金额为两万,发票号和发票金额分别为 (A001,5000) (A002,4000) (A003,2000) (A004,6000) (A005,3000) 三个单号分别为(B001,10000),
(B002,2000),(B003,8000)
希望产生的分摊轨迹
(A001,5000) (B001,5000)
(A002,4000) (B001,4000)
(A003,1000) (B001,1000)
(A003,1000) (B002,1000)
(A004,1000) (B002,1000)
(A004,5000) (B003,5000)
(A005,3000) (B003,3000)
不知道你这个问题是否已经解决, 如果还没有解决的话:选择排序的思想是:双重循环遍历数组,每经过一轮比较,找到最小元素的下标,将其交换至首位。
public static void selectionSort_1(int[] arr)
{
int minIndex;//需要一个最小值索引下标
for (int i = 0; i < arr.Length-1; i++)
{
minIndex = i; //每一个位置的最小值从头开始
for (int j = i+1; j < arr.Length; j++)
{
if (arr[minIndex]>arr[j]) //当前最小值位置 > J位置
{
minIndex = j;//记录最新的最小值位置,循环结束后最后得出最小值位置
}
}
//交换当前位置和最小值位置
arr[minIndex] = arr[minIndex] + arr[i];
arr[i] = arr[minIndex] - arr[i]; //现在当前位置变为最小值
arr[minIndex] = arr[minIndex] - arr[i]; //把原先的最小值位置交换到前面
}
}
动图演示
冒泡排序和选择排序有什么异同?
相同点:
不同点:
【不稳定的例子】
选择排序中,最小值和首位交换的过程可能会破坏稳定性。比如数列:[2, 2, 1],在选择排序中第一次进行交换时,原数列中的两个 2 的相对顺序就被改变了,因此,我们说选择排序是不稳定的。