You are here: irt.org | FAQ | JavaScript | Text | Q501 [ previous next ]
The following functions were kindly provided by Matti Helin:
// Uses Iterative (non-recursive) Quick Sort Algorithm // from Knuth, D. The art of computer programming, vol. 3 // sorting and searching // // usage: SelectTextSort(document.formname.selectname, {true|false} ) // true = keep selected // false = unselect all function SelectTextSort( obj, opt ) { // sort by text var Left = 0, Right = obj.options.length-1, top = 1; var lStack = new Array(), rStack = new Array(); lStack[top] = Left; rStack[top] = Right; while (top!=0) { Left = lStack[top]; Right = rStack[top]; top--; while (Left < Right) { var i = Left, j = Right, n = Left+Right; var k = Math.floor(n / 2) var x = obj.options[k].text; while (i <= j) { while (obj.options[i].text < x) { i++ } while (obj.options[j].text > x) { j-- } if (i <= j) { var i1= (obj.options[i].selected == true ) ? true : false var j1= (obj.options[j].selected == true ) ? true : false var q1 = obj.options[j].text; var q2 = obj.options[j].value; obj.options[j].text = obj.options[i].text; obj.options[j].value = obj.options[i].value; obj.options[i].text = q1; obj.options[i].value = q2; obj.options[i].selected = (j1&opt) ? true : false obj.options[j].selected = (i1&opt) ? true : false i++; j-- } } if ((j - Left) < (Right - i)) { if (i < Right) { top++; lStack[top] = i; rStack[top] = Right } Right = j; } else { if (Left < j) { top++; lStack[top] = Left; rStack[top] = j } Left = i; } } } return true } // usage: SelectValueSort(document.formname.selectname, {true|false} ) // true = keep selected // false = unselect all function SelectValueSort( obj, opt ) { // sort by value var Left = 0, Right = obj.options.length-1, top = 1; var lStack = new Array(), rStack = new Array(); lStack[top] = Left; rStack[top] = Right; while (top!=0) { Left = lStack[top]; Right = rStack[top]; top--; while (Left < Right) { var i = Left, j = Right, n = Left+Right; var k = Math.floor(n / 2) var x = obj.options[k].value; while (i <= j) { while (obj.options[i].value < x) { i++ } while (obj.options[j].value > x) { j-- } if (i <= j) { var i1= (obj.options[i].selected == true ) ? true : false var j1= (obj.options[j].selected == true ) ? true : false var q1 = obj.options[j].text; var q2 = obj.options[j].value; obj.options[j].text = obj.options[i].text; obj.options[j].value = obj.options[i].value; obj.options[i].text = q1; obj.options[i].value = q2; obj.options[i].selected = (j1&opt) ? true : false obj.options[j].selected = (i1&opt) ? true : false i++; j-- } } if ((j - Left) < (Right - i)) { if (i < Right) { top++; lStack[top] = i; rStack[top] = Right } Right = j; } else { if (Left < j) { top++; lStack[top] = Left; rStack[top] = j } Left = i; } } } return true }
The same with Bubble Sort
// usage: SelectTextSort(document.formname.selectname, {true|false} ) // true = keep selected // false = unselect all function SelectTextSort(obj, opt ) { // sort by text var N=obj.options.length; for (var i=0;i<N-1;i++) { for (var j=i+1;j<N;j++) { if ( obj.options[i].text > obj.options[j].text ) { var i1= (obj.options[i].selected == true ) ? true : false var j1= (obj.options[j].selected == true ) ? true : false var q1 = obj.options[j].text; var q2 = obj.options[j].value; obj.options[j].text = obj.options[i].text; obj.options[j].value = obj.options[i].value; obj.options[i].text = q1; obj.options[i].value = q2; obj.options[i].selected = (j1&opt) ? true : false obj.options[j].selected = (i1&opt) ? true : false } } } return true } // usage: SelectValueSort(document.formname.selectname, {true|false} ) // true = keep selected // false = unselect all function SelectValueSort(obj, opt ) { // sort by value var N=obj.options.length; for (var i=0;i<N-1;i++) { for (var j=i+1;j<N;j++) { if ( obj.options[i].value > obj.options[j].value ) { var i1= (obj.options[i].selected == true ) ? true : false var j1= (obj.options[j].selected == true ) ? true : false var q1 = obj.options[j].text; var q2 = obj.options[j].value; obj.options[j].text = obj.options[i].text; obj.options[j].value = obj.options[i].value; obj.options[i].text = q1; obj.options[i].value = q2; obj.options[i].selected = (j1&opt) ? true : false obj.options[j].selected = (i1&opt) ? true : false } } } return true }
It works beautifully in Netscape Navigator 4, Netscape Navigator 3 and Internet Explorer 4. It does not work in Netscape Navigator 2 and Internet Explorer 3 but nothing will as JavaScript 1.0 only allows read only access to the the text property.