Skip to content

Instantly share code, notes, and snippets.

@bromne
Last active June 27, 2016 13:45
Show Gist options
  • Select an option

  • Save bromne/e73466894c6f470e6b0c90776a486c26 to your computer and use it in GitHub Desktop.

Select an option

Save bromne/e73466894c6f470e6b0c90776a486c26 to your computer and use it in GitHub Desktop.
Quicksort: comparison of recursive and loop
var swap = function(elements, i, j) {
var temp = elements[i];
elements[i] = elements[j];
elements[j] = temp;
};
var calculate_pivot_index = function(elements, left, right) {
return right;
};
var partition = function(elements, left, right) {
swap(elements, right, calculate_pivot_index(elements, left, right));
var pivot = elements[right];
var leftEnd = left - 1;
for (var i = left; i < right; i++) {
if (elements[i] <= pivot) {
leftEnd++;
swap(elements, leftEnd, i);
}
}
var middle = leftEnd + 1;
swap(elements, middle, right);
return middle;
};
// 再帰版
var quick_sort_recursive = function(elements) {
var quick = function(elements, left, right) {
if (right - left > 1) {
var middle = partition(elements, left, right);
quick(elements, left, middle - 1);
quick(elements, middle + 1, right);
}
};
quick(elements, 0, elements.length - 1);
};
// ループ版
var quick_sort_loop = function(elements) {
var stack = [];
stack.push({left: 0, right: elements.length - 1});
while (true) {
if (stack.length > 0) {
var context = stack.pop();
if (context.right - context.left > 1) {
var middle = partition(elements, context.left, context.right);
stack.push({left: context.left, right: middle - 1});
stack.push({left: middle + 1, right: context.right});
}
} else
break;
}
};
(function() {
var e = [2, 1, 0, 7, 6, 5, 9];
quick_sort_recursive(e);
console.log(e);
var f = [2, 1, 0, 7, 6, 5, 9];
quick_sort_loop(f);
console.log(f);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment