原文地址http://www.cnblogs.com/taomylife/p/3429240.html,感谢分享!!!
1、快速排序(QuickSort)
JavaScript:
首先,从要排序的序列中先选取一个中间元素作为基准元素,遍历序列中的每一个元素,小于基准元素的放入一个新序列,否则放入另一个新序列;然后,使用递归方式处理每一个得到的新序列,直到得到的新序列不可再分割;最后,将每一层递归得到的新序列和基准元素进行连接。
<script type="text/javascript">
function quickSort(arr) {
if(arr.length <= 1) {
return arr;
}
/*选取一个基准元素*/
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
/*****************/
var left = [];
var right = [];
for(var i=0; i<arr.length; i++) {
if(arr[i] < pivot) {
left.push(arr[i]);
}
else {
right.push(arr[i]);
}
}
return quickSort(left).concat(pivot, quickSort(right));
}
alert(quickSort([12,1,4,8,2]).join(','));//'1,2,4,8,12'
</script>
c#
首先,从要排序的序列中先选取一个中间元素作为基准元素,从序列起始处开始向后循环,循环条件是序列元素小于基准元素,再从序列结尾处向前循环,循环条件是序列元素大于基准元素,将上述循环结束时的元素进行左右交换,这样小于基准元素的元素都在其左边,否则在其右边;然后使用递归用前述方式循环基准元素左右两边的新序列。
namespace TestApp { class Program { static void Main(string[] args) { List<int> list = new List<int>() { 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1 }; QuickSort(ref list, 0, list.Count - 1); foreach (int item in list) { System.Console.WriteLine(item.ToString()); } System.Console.ReadKey(); } private static void QuickSort(ref List<int> list, int left, int right) { if (left < right) { int i = left; int j = right; int middle = list[(left + right) / 2]; while (true) { while (i < right && list[i] < middle) { i++; } while (j > 0 && list[j] > middle) { j--; } if (i == j) break; list[i] = list[i] + list[j]; list[j] = list[i] - list[j]; list[i] = list[i] - list[j]; if (list[i] == list[j]) j--; } QuickSort(ref list, left, i); QuickSort(ref list, i + 1, right); } } } }
2、归并排序(merge sort)
JavaScript
<script type="text/javascript">
//合并两个已经排好序的数组
function mergeSortedList(left, right) {
var result = [];
var il = 0;
var ir = 0;
while(il < left.length && ir < right.length) {
if(left[il] < right[ir]) {
result.push(left[il++]);
}
else {
result.push(right[ir++]);
}
}
return result.concat(left.slice(il)).concat(right.slice(ir));
}
function mergeSort(list) {
if(list.length < 2) {
return list;
}
var middle = Math.floor(list.length / 2),
left = list.slice(0, middle),
right = list.slice(middle),
params = mergeSortedList(mergeSort(left), mergeSort(right));
//在params头部插入的这两个元素为调用splice方法时传入第一、二个参数
params.unshift(0, params.length);
list.splice.apply(list, params);
return list;
}
var arr = [1,4,87,2,1,4,6,9,2,0];
alert(mergeSort([1,4,87,2,1,4,6,9,2,0]).join(','));
//使用自带sort方法进行排序
alert(arr.sort(function(a, b) {return a - b; }).join(','));
</script>
3、插入排序
JavaScript
1、从逻辑上考虑将序列分成两部分(已排好序的和没排好序的两部分),假定已排好序的为A序列,未排好序的为B序列,排序开始前A序列为空,B序列为整个序列;
2、设置两层for循环,外层按下标从小到大遍历B序列,内层按下标从大到小遍历A序列,A序列的最后一个元素始终是B序列第一个元素的前一个;
3、外层循环每一次遍历时取出一个值compareValue作为B中第一个元素,内层循环从A序列的最后一个开始(currentlyValue)与compareValue进行比较,当currentlyValue大于compareValue时,将currentlyValue赋值给其下一个元素。
<script type="text/javascript">
function insertationSort(items) {
var len = items.length,
value, //当前要比较的值
i, //无序区域下标
j; //有序区域下标
for(i = 0; i < len; i++) {
value = items[i];
for(j = i - 1; j > -1 && items[j] > value; j--) {
items[j + 1] = items[j];
}
items[j + 1] = value;
}
return items;
}
alert(insertationSort([5, 2, 4, 6, 0, 1]).join(','));
</script>
4、选择排序
原理:选定序列中的任意一个元素,将其看成是最小的一个元素,然后和其它元素一一比较,若发现其它元素比较其更小,则交换二者,然后该更小的元素看成是最小元素,再次进行比较,直到序列中每一个元素都进行比较后排序结束。
<script type="text/javascript">
function swapItem(items, firstIndex, secondIndex) {
var temp = items[firstIndex];
items[firstIndex] = items[secondIndex];
items[secondIndex] = temp;
}
function selectionSort(items) {
var minIndex;
for(var i = 0; i < items.length; i++) {
minIndex = i;
for(var j = i + 1; j < items.length; j++) {
if(items[j] < items[minIndex]) {
minIndex = j;
}
}
if(i != minIndex) {
swapItem(items, i, minIndex);
}
}
return items;
}
alert(selectionSort([5,4,2,6,1,0]).join(','));
</script>
5、冒泡排序
原理:从序列的起始处或结尾处开始,每相邻两个元素进行比较,若前者大于后者,则交换二者,直到比较到序列最后或最前,找到一个最大元素放在最后。每一次对序列遍历都取出一个最大元素(下一次遍历会将上次遍历取出的最大值排除)。
<script type="text/javascript">
function swap(items, firstIndex, secondIndex){
var temp = items[firstIndex];
items[firstIndex] = items[secondIndex];
items[secondIndex] = temp;
}
function bubbleSort1(items) {
var len = items.length, i, j, stop;
for(i = 0; i < len; i++) {
for(j = 0, stop = len - i; j < stop; j++) {
if(items[j] > items[j + 1]) {
swap(items, j, j + 1);
}
}
}
return items;
}
function bubbleSort2(items) {
var len = items.length, i, j;
for(i = len - 1; i >= 0; i--) {
for(j = len - i; j >= 0; j--) {
if(items[j] < items[j - 1]) {
swap(items, j, j - 1);
}
}
}
return items;
}
alert(bubbleSort1([3, 2, 4, 5, 1]).join(','));
alert(bubbleSort2([3, 2, 4, 5, 1]).join(','));
</script>