1、选择排序:每次排序都把最小的放在最前面,或者把最大的放到最前面
private function selectionSort(array:Array):void
{
var len:int = array.length;
for (var i:int = 0; i < len - 1; i++)
{
var min:int = array[i];
var minIndex:int = i;
for (var k:int = i + 1; k < len; k++)
{
if (array[k] < min)
{
min = array[k];
minIndex = k;
}
}
if (minIndex != i)
{
array[minIndex] = array[i];
array[i] = min;
}
}
}
{
var len:int = array.length;
for (var i:int = 0; i < len - 1; i++)
{
var min:int = array[i];
var minIndex:int = i;
for (var k:int = i + 1; k < len; k++)
{
if (array[k] < min)
{
min = array[k];
minIndex = k;
}
}
if (minIndex != i)
{
array[minIndex] = array[i];
array[i] = min;
}
}
}
2、冒泡排序:依次交换,每次排序之后最大的数都到了最后
private function bubbleSort(array:Array):void
{
var len:int = array.length;
var needSort:Boolean = true;
for (var i:int = 1; i < len && needSort; i++)
{
needSort = false;
for (var k:int = 0; k < len - i; k++)
{
if (array[k] > array[k + 1])
{
var temp:int = array[k];
array[k] = array[k + 1];
array[k + 1] = temp;
needSort = true;
}
}
}
}
{
var len:int = array.length;
var needSort:Boolean = true;
for (var i:int = 1; i < len && needSort; i++)
{
needSort = false;
for (var k:int = 0; k < len - i; k++)
{
if (array[k] > array[k + 1])
{
var temp:int = array[k];
array[k] = array[k + 1];
array[k + 1] = temp;
needSort = true;
}
}
}
}
3、插入排序(直接插入):每次插入前前面的数组都已经排好序
private function insertSort(array:Array):void
{
var len:int = array.length;
for (var i:int = 1; i < len; i++)
{
var temp:int = array[i];
for (var k:int = i - 1; k >= 0 && array[k] > temp; k--)
{
array[k + 1] = array[k];
}
array[k + 1] = temp;
}
}
{
var len:int = array.length;
for (var i:int = 1; i < len; i++)
{
var temp:int = array[i];
for (var k:int = i - 1; k >= 0 && array[k] > temp; k--)
{
array[k + 1] = array[k];
}
array[k + 1] = temp;
}
}
3、插入排序(二分插入):因为每次插入前前面的数组都已经排好序,所以可以通过二分法找到合适的插入位置
private function binaryInsertSort(array:Array):void
{
var len:int = array.length;
var low:int;
var high:int;
var mid:int;
for (var i:int = 1; i < len; i++)
{
var temp:int = array[i];
low = 0;
high = i - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (temp > array[mid])
{
low = mid + 1;
}else {
high = mid - 1;
}
}
for (var j:int = i - 1; j > high; j--)
{
array[j + 1] = array[j];
}
array[high + 1] = temp;
}
}
{
var len:int = array.length;
var low:int;
var high:int;
var mid:int;
for (var i:int = 1; i < len; i++)
{
var temp:int = array[i];
low = 0;
high = i - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (temp > array[mid])
{
low = mid + 1;
}else {
high = mid - 1;
}
}
for (var j:int = i - 1; j > high; j--)
{
array[j + 1] = array[j];
}
array[high + 1] = temp;
}
}
4、希尔排序(简单实用的排序方法):通过改进插入排序方法而来(有间隔的插入排序),虽然代码很好写,但是我一直都不是很懂为什么这样更快
private function shellSort(array:Array):void
{
var len:int = array.length;
var distance:int = len;
while (distance > 1)
{
distance = distance / 3 + 1;
for (var i:int = distance; i < len; i++)
{
var temp:int = array[i];
for (var k:int = i - distance; k >= 0 && array[k] > temp; k = k - distance)
{
array[k + distance] = array[k];
}
array[k + distance] = temp;
}
}
}
{
var len:int = array.length;
var distance:int = len;
while (distance > 1)
{
distance = distance / 3 + 1;
for (var i:int = distance; i < len; i++)
{
var temp:int = array[i];
for (var k:int = i - distance; k >= 0 && array[k] > temp; k = k - distance)
{
array[k + distance] = array[k];
}
array[k + distance] = temp;
}
}
}
5、归并排序:利用分治的思想,通过递归,一句话,就是拆分拆分再拆分,合并合并再合并。
private function mergeSort(array:Array):void
{
var len:int = array.length;
if (len > 1)
{
var firstArray:Array = array.slice(0, len / 2);
mergeSort(firstArray);
var secondArray:Array = array.slice(len / 2, len);
mergeSort(secondArray);
var tempArray:Array = mergeArray(firstArray, secondArray);
var length:int = array.length;
for (var i:int = 0; i < length; i++)
{
array[i] = tempArray[i];
}
}
}
private function mergeArray(firstArray:Array, secondArray:Array):Array
{
var firstIndex:int = 0;
var secondIndex:int = 0;
var tempIndex:int = 0;
var tempArray:Array = [];
var firstLen:int = firstArray.length;
var secondLen:int = secondArray.length;
while (firstIndex < firstLen && secondIndex < secondLen)
{
if (firstArray[firstIndex] < secondArray[secondIndex])
{
tempArray[tempIndex++] = firstArray[firstIndex++];
}
else
{
tempArray[tempIndex++] = secondArray[secondIndex++];
}
}
while (firstIndex < firstLen)
{
tempArray[tempIndex++] = firstArray[firstIndex++];
}
while (secondIndex < secondLen)
{
tempArray[tempIndex++] = secondArray[secondIndex++];
}
return tempArray;
}
{
var len:int = array.length;
if (len > 1)
{
var firstArray:Array = array.slice(0, len / 2);
mergeSort(firstArray);
var secondArray:Array = array.slice(len / 2, len);
mergeSort(secondArray);
var tempArray:Array = mergeArray(firstArray, secondArray);
var length:int = array.length;
for (var i:int = 0; i < length; i++)
{
array[i] = tempArray[i];
}
}
}
private function mergeArray(firstArray:Array, secondArray:Array):Array
{
var firstIndex:int = 0;
var secondIndex:int = 0;
var tempIndex:int = 0;
var tempArray:Array = [];
var firstLen:int = firstArray.length;
var secondLen:int = secondArray.length;
while (firstIndex < firstLen && secondIndex < secondLen)
{
if (firstArray[firstIndex] < secondArray[secondIndex])
{
tempArray[tempIndex++] = firstArray[firstIndex++];
}
else
{
tempArray[tempIndex++] = secondArray[secondIndex++];
}
}
while (firstIndex < firstLen)
{
tempArray[tempIndex++] = firstArray[firstIndex++];
}
while (secondIndex < secondLen)
{
tempArray[tempIndex++] = secondArray[secondIndex++];
}
return tempArray;
}
6、快速排序:把数组分成左小右大,递归,完事
private function quickSort(array:Array, low:int, high:int):void
{
if (low < high)
{
var pivotIndex:int = halfArray(array, low, high);
quickSort(array, low, pivotIndex - 1);
quickSort(array, pivotIndex + 1, high);
}
}
private function halfArray(array:Array, low:int, high:int):int
{
var pivot:int = array[low];
while (low < high)
{
while (low < high && array[high] >= pivot)
{
high--;
}
array[low] = array[high];
while (low < high && array[low] <= pivot)
{
low++;
}
array[high] = array[low];
}
array[low] = pivot;
return low;
}
{
if (low < high)
{
var pivotIndex:int = halfArray(array, low, high);
quickSort(array, low, pivotIndex - 1);
quickSort(array, pivotIndex + 1, high);
}
}
private function halfArray(array:Array, low:int, high:int):int
{
var pivot:int = array[low];
while (low < high)
{
while (low < high && array[high] >= pivot)
{
high--;
}
array[low] = array[high];
while (low < high && array[low] <= pivot)
{
low++;
}
array[high] = array[low];
}
array[low] = pivot;
return low;
}
7、堆排序:利用堆的思想对数组进行排序(最大堆就是父节点比子节点都大)
private function heapSort(array:Array):void
{
var len:int = array.length;
for (var i:int = 1; i < len; i++)
{
makeHeap(array, i);
}
for (var k:int = len - 1; k > 0; k--)
{
var temp:int = array[k];
array[k] = array[0];
array[0] = temp;
updateHeap(array, k - 1);
}
}
private function makeHeap(array:Array, last:int):void
{
var currentIndex:int = last;
while (currentIndex > 0)
{
if (array[currentIndex] > array[int((currentIndex - 1) / 2)])
{
var temp:int = array[currentIndex];
array[currentIndex] = array[int((currentIndex - 1) / 2)];
array[int((currentIndex - 1) / 2)] = temp;
currentIndex = (currentIndex - 1) / 2;
}
else
{
break;
}
}
}
private function updateHeap(array:Array, last:int):void
{
var currentIndex:int = 0;
var isHeap:Boolean = false;
while (!isHeap)
{
var leftIndex:int = 2 * currentIndex + 1;
var rightIndex:int = 2 * currentIndex + 2;
var maxIndex:int = currentIndex;
if (leftIndex <= last && array[currentIndex] < array[leftIndex])
{
maxIndex = leftIndex;
}
if (rightIndex <= last && array[maxIndex] < array[rightIndex])
{
maxIndex = rightIndex;
}
if (maxIndex != currentIndex)
{
var temp:int = array[currentIndex];
array[currentIndex] = array[maxIndex];
array[maxIndex] = temp;
currentIndex = maxIndex;
}
else
{
isHeap = true;
}
}
}
{
var len:int = array.length;
for (var i:int = 1; i < len; i++)
{
makeHeap(array, i);
}
for (var k:int = len - 1; k > 0; k--)
{
var temp:int = array[k];
array[k] = array[0];
array[0] = temp;
updateHeap(array, k - 1);
}
}
private function makeHeap(array:Array, last:int):void
{
var currentIndex:int = last;
while (currentIndex > 0)
{
if (array[currentIndex] > array[int((currentIndex - 1) / 2)])
{
var temp:int = array[currentIndex];
array[currentIndex] = array[int((currentIndex - 1) / 2)];
array[int((currentIndex - 1) / 2)] = temp;
currentIndex = (currentIndex - 1) / 2;
}
else
{
break;
}
}
}
private function updateHeap(array:Array, last:int):void
{
var currentIndex:int = 0;
var isHeap:Boolean = false;
while (!isHeap)
{
var leftIndex:int = 2 * currentIndex + 1;
var rightIndex:int = 2 * currentIndex + 2;
var maxIndex:int = currentIndex;
if (leftIndex <= last && array[currentIndex] < array[leftIndex])
{
maxIndex = leftIndex;
}
if (rightIndex <= last && array[maxIndex] < array[rightIndex])
{
maxIndex = rightIndex;
}
if (maxIndex != currentIndex)
{
var temp:int = array[currentIndex];
array[currentIndex] = array[maxIndex];
array[maxIndex] = temp;
currentIndex = maxIndex;
}
else
{
isHeap = true;
}
}
}
8、基数排序(利用桶的思想,遍历把数组项装进不同的桶,再组合,在装桶,循环几次即可(跟最大位数跟所选基数有关))
/**
* 基数排序
* @param array 待排序的数组
* @param base 基数
*/
private function radixSort(array:Array, base:int = 10):void
{
var maxLen:int = findLen(array, base);
var arrLen:int = array.length;
var temp:int = 1;
var container:Array = [];
for (var i:int = 0; i < base; i++)
container[i] = [];
while (maxLen--)
{
// 放到相应的容器中
for (var j:int = 0; j < arrLen; j++)
{
container[int(array[j] / temp) % base].push(array[j]);
}
temp *= base;
// 重新排列
array.length = 0;
var containerLen:int = container.length;
for (var k:int = 0; k < containerLen; k++)
{
if(container[k].length)
{
var len:int = container[k].length;
for (var m:int = 0; m < len; m++)
{
array.push(container[k][m]);
}
container[k].length = 0;
}
}
}
}
/**
* 找出数组项最大长度
* @param array 待排序的数组
* @param base 基数
* @return
*/
private function findLen(array:Array, base:int):int
{
var maxLen:int = 1;
var temp:int = base;
var len:int = array.length;
for (var i:int = 0; i < len; i++)
{
while (array[i] >= temp)
{
maxLen++;
temp *= base;
}
}
return maxLen;
}
* 基数排序
* @param array 待排序的数组
* @param base 基数
*/
private function radixSort(array:Array, base:int = 10):void
{
var maxLen:int = findLen(array, base);
var arrLen:int = array.length;
var temp:int = 1;
var container:Array = [];
for (var i:int = 0; i < base; i++)
container[i] = [];
while (maxLen--)
{
// 放到相应的容器中
for (var j:int = 0; j < arrLen; j++)
{
container[int(array[j] / temp) % base].push(array[j]);
}
temp *= base;
// 重新排列
array.length = 0;
var containerLen:int = container.length;
for (var k:int = 0; k < containerLen; k++)
{
if(container[k].length)
{
var len:int = container[k].length;
for (var m:int = 0; m < len; m++)
{
array.push(container[k][m]);
}
container[k].length = 0;
}
}
}
}
/**
* 找出数组项最大长度
* @param array 待排序的数组
* @param base 基数
* @return
*/
private function findLen(array:Array, base:int):int
{
var maxLen:int = 1;
var temp:int = base;
var len:int = array.length;
for (var i:int = 0; i < len; i++)
{
while (array[i] >= temp)
{
maxLen++;
temp *= base;
}
}
return maxLen;
}
over!