现在的位置: 首页 > 综合 > 正文

八大排序算法实现

2014年11月14日 ⁄ 综合 ⁄ 共 6703字 ⁄ 字号 评论关闭

1、选择排序:每次排序都把最小的放在最前面,或者把最大的放到最前面

private function selectionSort(array:Array):void
{

   var len:int = array.length;

   for (var i:int = 0i < len - 1i++)

   {

       var min:int = array[i];

       var minIndex:int = i;

       for (var k:int = i + 1k < lenk++)

       {

           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 = 1i < len && needSorti++)

   {

       needSort = false;

       for (var k:int = 0k < len - ik++)

       {

           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 = 1i < leni++)

   {

       var temp:int = array[i];

       for (var k:int = i - 1k >= 0 && array[k] > tempk--)

       {

           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 = 1i < leni++)

   {

       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 - 1j > highj--)

       {

           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 = distancei < leni++)

       {

           var temp:int = array[i];

                     for (var k:int = i - distancek >= 0 && array[k] > tempk = 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 = 0i < lengthi++)

       {

           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;
}
 
7、堆排序:利用堆的思想对数组进行排序(最大堆就是父节点比子节点都大)

private function heapSort(array:Array):void
{

   var len:int = array.length;

   for (var i:int = 1i < leni++)

   {

       makeHeap(array, i);

   }

   for (var k:int = len - 1k > 0k--)

   {

       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 = 0i < basei++)

       container[i] = [];

   

   while (maxLen--)

   {

       //    放到相应的容器中

       for (var j:int = 0j < arrLenj++)

       {

           container[int(array[j] / temp% base].push(array[j]);

       }

       temp *= base;

       //    重新排列

       array.length = 0;

       var containerLen:int = container.length;

       for (var k:int = 0k < containerLenk++)

       {

           if(container[k].length)

           {

               var len:int = container[k].length;

               for (var m:int = 0m < lenm++)

               {

                   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 = 0i < leni++)

   {

       while (array[i] >= temp)

       {

           maxLen++;

           temp *= base;

       }

   }

   

   return maxLen;
}
 
over!

抱歉!评论已关闭.