稳定的排序 |
时间复杂度 |
空间复杂度 |
冒泡排序(bubble sort) |
最差、平均都是O(n^2),最好是O(n) |
1 |
插入排序(insertion sort) |
最差、平均都是O(n^2),最好是O(n) |
1 |
归并排序(merge sort) |
最差、平均、最好都是O(n log n) |
O(n) |
桶排序(bucket sort) |
O(n) |
O(k) |
基数排序(Radix sort) |
O(dn)(d是常数) |
O(n) |
二叉树排序(Binary tree sort) |
O(n log n) |
O(n) |
不稳定的排序 |
时间复杂度 |
空间复杂度 |
选择排序(selection sort) |
最差、平均都是O(n^2) |
1 |
希尔排序(shell sort) |
O(n log n) |
1 |
堆排序(heapsort) |
最差、平均、最好都是O(n log n) |
1 |
快速排序(quicksort) |
平均是O(n log n),最差是O(n^2) |
O(log n) |
一、冒泡排序
二、插入排序
2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5. 将新元素插入到下一位置中
6. 重复步骤2
三、归并排序
1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2、设定两个指针,最初位置分别为两个已经排序序列的起始位置
3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4、重复步骤3直到某一指针达到序列尾
5、将另一序列剩下的所有元素直接复制到合并序列尾
四、桶排序
在桶排序算法的代码中,假设输入是个含n个元素的数组A,且每个元素满足0≤A[i]<1。另外还需要一个辅助数组B[O..n-1]来存放链表实现的桶,并假设可以用某种机制来维护这些表。
五、基数排序
(1)若关键字是十进制整数,则按个、十等位进行分解,基数rd=10,C0=0,C9=9,d为最长整数的位数.
(2)若关键字是小写的英文字符串,则rd=26,C0='a',C25='z',d为最长字符串的长度.
基数排序的基本思想是:从低位到高位依次对待排序的关键码进行分配和收集,经过d趟分配和收集,就可以得到一个有序序列.
六、二叉树排序
2、判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。
3、若二叉树为空。则首先单独生成根结点。
PS:新插入的结点总是叶子结点。依次插入数据即完成建树。
1、如果结点z没有子女,则修改其父结点p[z],使NIL为其子女;
七、选择排序
八、希尔排序
九、堆排序
(1) ki≤K2i 且 ki≤K2i+1
1、先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
2、再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
3、由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
……
直到无序区只有一个元素为止。
十、快速排序
PHP语言实现代码:
<?PHP /* * 插入排序(一维数组) * *插入排序的基本思想:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。 */ function insertSort($arr){ if(!is_array($arr) || count($arr)==0){ return $arr; } $count = count($arr); for($i=1; $i<$count; $i++){ if(isset($arr[$i])){ $tmp = $arr[$i]; //获取后一个元素的值 $j = $i - 1; //获取前面的下标 while($arr[$j] > $tmp){ //如果前面一个比后面一个大, 这里是从小到大 $arr[$j+1] = $arr[$j]; //把小的元素和前面的对换,直到移动到合适的位置,在移动下一个 $arr[$j] = $tmp; $j--; } } } return $arr; } /* * 选择排序(一维数组) * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 */ function selectSort($arr){ if(!is_array($arr) || count($arr) == 0) { return $arr; } $count = count($arr); for($i=0; $i<$count; $i++){ $k = $i; for($j=$i+1; $j<$count; $j++){ if ($arr[$k] > $arr[$j]) $k = $j; //找出最小的 if ($k != $i){ $tmp = $arr[$i]; $arr[$i] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr; } /* * 冒泡排序(一维数组) * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止 */ function bubbleSort($array){ $count = count($array); if ($count <= 0) { return false; } for($i=0; $i<$count; $i++){ for($j=$count-1; $j>$i; $j--){ if ($array[$j] < $array[$j-1]){ //比较找到的数进行交换 $tmp = $array[$j]; $array[$j] = $array[$j-1]; $array[$j-1] = $tmp; } } } return $array; } /* * 快速排序(一维数组) * */ function quickSort($array){ if (count($array) <= 1){ return $array; } $key = $array[0]; $left_arr = array(); $right_arr = array(); for ($i=1; $i<count($array); $i++){ if ($array[$i] <= $key){ $left_arr[] = $array[$i]; }else{ $right_arr[] = $array[$i]; } } $left_arr = quickSort($left_arr); $right_arr = quickSort($right_arr); return array_merge($left_arr,array($key),$right_arr); } /** * 按照元素的值进行排序 * strOrder 为排列的顺序 asc 升序 desc 降序 */ function sortByVal($arr,$strOrder='asc') { if(!is_array($arr) || count($arr)==0) { return $arr; } $arrReturn = array(); foreach($arr as $key=>$val) { $arrKey[] = $key; $arrVal[] = $val; } $count = count($arrVal); if($count) { //创建key的顺序数组 for($key=0;$key<$count;$key++) { $arrKeyMap[$key] = $key; } //对值进行排序 for($i=0;$i<$count;$i++) { for($j = $count-1; $j>$i;$j--) { //<从小到大排列 升降在这修改 $bol = $strOrder == 'asc' ? $arrVal[$j]<$arrVal[$j-1] : $arrVal[$j]>$arrVal[$j-1]; if($bol){ $tmp = $arrVal[$j]; $arrVal[$j] = $arrVal[$j-1]; $arrVal[$j-1] = $tmp; //值的冒泡排序,引起key的数组的交互 $keytmp = $arrKeyMap[$j]; $arrKeyMap[$j] = $arrKeyMap[$j-1]; $arrKeyMap[$j-1] = $keytmp; } } } if(count($arrKeyMap)) { foreach ($arrKeyMap as $val) { $arrReturn[] = $arrKey[$val]; } } return $arrReturn; } } /** * 使用原生的函数进行数组按照值进行排列 */ function arraySortByVal($arr,$keys,$type='asc'){ $keysvalue = $new_array = array(); foreach ($arr as $k=>$v){ $keysvalue[$k] = $v[$keys]; } if($type == 'asc'){ asort($keysvalue); }else{ arsort($keysvalue); } reset($keysvalue); foreach ($keysvalue as $k=>$v){ $new_array[$k] = $arr[$k]; } return $new_array; }