Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Подскажите по сортировке массива (https://javascript.ru/forum/misc/45150-podskazhite-po-sortirovke-massiva.html)

NuclleaR 17.02.2014 01:47

Подскажите по сортировке массива
 
есть код
var arr=[],n , i, j, col, row, c, X;
//----------------------------------------------------------------------------
for (col = 0; col<5; col++){
    arr.push([]);
    for(row=0; row<5; row++){
        var x=Math.round(Math.random()*100);
        arr[col].push(x);
    }
}
alert(arr.join('\n'));
//----------------------------------------------------------------------------
n = arr.length;
    for ( i = 0; i < n-1; i++){
        for( j = i+1; j < n; j++){
            for ( c = 0; c < n; c++){
                if(arr[j][c] < arr[i][c]){
                    X = arr[i][c];
                    arr[i][c]=arr[j][c];
                    arr[j][c]=X;
                }
            }

        }

    }
alert(arr.join('\n'));


Подскажите как его переделать чтобы сортировать по строкам и по всему массиву.

рони 17.02.2014 04:33

NuclleaR,
сначала отсортировать содержимое строк потом строки между собой
var arr=[],n , i, j, col, row, c, X;
//----------------------------------------------------------------------------
for (col = 0; col<5; col++){
    arr.push([]);
    for(row=0; row<5; row++){
        var x=Math.round(Math.random()*5);
        arr[col].push(x);
    }
}
alert(arr.join('\n'));
//----------------------------------------------------------------------------

function sort(a) {
    for (var b = 0; b < a.length - 1; b++)
        for (var c = b + 1; c < a.length; c++) {
            var e = a[c].length;
            if (e)
                for (var d = 0; d < e; d++) {
                    if (a[c][d] != a[b][d]) {
                        if (a[c][d] > a[b][d]) break;
                        if (a[c][d] < a[b][d]) {
                            e = a[b];
                            a[b] = a[c];
                            a[c] = e;
                            break
                        }
                    }
                } else a[c] < a[b] && (e = a[b], a[b] = a[c], a[c] = e)
        }
    return a
};

for (var i=0; i<arr.length; i++)  {
  arr[i]=sort(arr[i])
}
arr = sort(arr);
alert(arr.join('\n'));

NuclleaR 17.02.2014 11:05

рони,
А если нужно привести массив в вид:
11122
22223
33444
55668
89999

то нужно его превратить в одномерный, отсортировать и собрать обратно в двумерный

рони 17.02.2014 11:26

Цитата:

Сообщение от NuclleaR
то нужно его превратить в одномерный, отсортировать и собрать обратно в двумерный

да
var arr=[],n , i, j, col, row, c, X;
//----------------------------------------------------------------------------
for (col = 0; col<5; col++){
    arr.push([]);
    for(row=0; row<5; row++){
        var x=Math.round(Math.random()*5);
        arr[col].push(x);
    }
}
alert(arr.join('\n'));
//----------------------------------------------------------------------------

function sort(a) {
    for (var b = 0; b < a.length - 1; b++)
        for (var c = b + 1; c < a.length; c++) {
            var e = a[c].length;
            if (e)
                for (var d = 0; d < e; d++) {
                    if (a[c][d] != a[b][d]) {
                        if (a[c][d] > a[b][d]) break;
                        if (a[c][d] < a[b][d]) {
                            e = a[b];
                            a[b] = a[c];
                            a[c] = e;
                            break
                        }
                    }
                } else a[c] < a[b] && (e = a[b], a[b] = a[c], a[c] = e)
        }
    return a
};
var z = [];
for (var i=0; i<arr.length; i++)  {
  z = z.concat(arr[i])
}
z = sort(z);
for (var i=0; i<5; i++)  {
  z.push(z.splice(0,5))
}
alert(z.join('\n'));

danik.js 17.02.2014 13:43

Если использовать ES5 функцию sort, то все проще:
var arr=[],n , i, j, col, row, c, X;
//----------------------------------------------------------------------------
for (col = 0; col<5; col++){
    arr.push([]);
    for(row=0; row<5; row++){
        var x=Math.round(Math.random()*5);
        arr[col].push(x);
    }
}
alert(arr.join('\n'));
//----------------------------------------------------------------------------

var flat = [];
for (var i = 0; i < arr.length; i++)  {
  flat = flat.concat(arr[i]);
}

var sorted = flat.sort();

var result = [];
for (var i = 0; i < flat.length; i += 5) {
    result.push(sorted.slice(i, i + 5));
}

alert(result.join('\n'));

рони 17.02.2014 13:47

danik.js,
без встроенных функций сортировки иначе зачем огород

danik.js 17.02.2014 13:52

рони, а где это сказано в условии? А огород от незнания. Вон народ по старой памяти document.all юзает еще ))

рони 17.02.2014 14:00

Цитата:

Сообщение от danik.js
рони, а где это сказано в условии?

ТС забыл уточнить.

NuclleaR 17.02.2014 17:01

Да сорри забыл уточнить sort низя использовать:)

danik.js 17.02.2014 17:28

Цитата:

Сообщение от NuclleaR
sort низя использовать

Это потому что он быстрей чем самописная функция? Или что ES5? Дык эту кастомную sort можно писать в прототип при отсутствии нативной.
Или типа из академического интереса? Дык тогда и concat как-бы нельзя использовать. И splice тоже.


Часовой пояс GMT +3, время: 22:25.