It is like bubble sort type of algorithm. I'm not tested it on different data sets, created just for fun and your critic)
struct valuePos {int val; int pos;} valuePos[,] data = new valuePos[n,n]; // assign input data array to [val] properties // initialize by maximum val in data +1 or just unreachable value // if index is not in use, calculated CompetitiveSwaps value will be less than zero and we use this as flag int[] CompetitiveSwaps = {10000,10000,...}; // array of values to compare int[] indexCount = {0,0,0...,0}; // size of n sort each column of data by val // input matrix val(index) after sort 6(1) 200(1) 20(1) 150(1) | 4(2) 3(2) 2(2) 10(3) 4(2) 3(2) 2(2) 100(2) | 6(1) 30(3) 20(1) 100(2) 300(3) 30(3) 400(3) 10(3) | 300(3) 200(1) 300(4) 150(1) 400(4) 300(4) 300(4) 400(4) | 400(4) 300(4) 400(3) 400(4) int swapRow=1; while(indexCount.indexof(0) != -1) // until all indexes will be used once, so all elements in indexCount array are "1" { for(int i =0; i <n ;i++) { indexCount[data[0, i].pos]++; //indexCount {0, 3, 1, 0} for first iteration // calculate current replacement weight of such index, the more times index is used the less expensive to replace it ( / indexCount[data[0, i].pos]) CompetitiveSwaps[data[0, i].pos] = data[0, i].val / indexCount[data[0, i].pos]; //CompetitiveSwaps {10000, 0, 10, 10000} for first iteration } for(int i =0; i <n ;i++) { //[0] 6 - 4 -10000 = -9998; [1] 30 - 3 -10 = 17; [2] 20 - 2 -10000= -9982; [3] 100 - 10 - 0 =90 for first iteration // calculating increase of sum in case of swap by substracting top array val from replacement val ( data[swapRow, i].val - data[0, i].val ) // and indirect increase in case of replacement the current val of such index ( - CompetitiveSwaps[data[swapRow, i].pos]) CompetitiveSwaps[i] = data[swapRow, i].val - data[0, i].val - CompetitiveSwaps[data[swapRow, i].pos]; } int minValColumn = find_Index_Of_Minimum_Value(CompetitiveSwaps); if(CompetitiveSwaps[minValColumn] < 0) // using negative value as sign that index is not in use, and it must "float" to the top { swap(data[swapRow, minValColumn], data[0, minValColumn]); }else { swapRow++; } CompetitiveSwaps = {10000,10000,...}; } -- You received this message because you are subscribed to the Google Groups "Algorithm Geeks" group. To unsubscribe from this group and stop receiving emails from it, send an email to algogeeks+unsubscr...@googlegroups.com.