八大排序算法实现

来源:互联网 发布:浅谈软件项目风险管理 编辑:程序博客网 时间:2024/06/04 19:29

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!
原创粉丝点击