排序高级之交换排序_臭皮匠排序

简介:

Stooge 排序是一种低效的递归排序算法,甚至慢于冒泡排序。在《算法导论》第二版第7章(快速排序)的思考题中被提到,是由HowardFine等教授提出的所谓“漂亮的”排序算法。

该算法得名于三个臭皮匠,每个臭皮匠都打其他两个


实现

  • 如果最后一个值小于第一个值,则交换这两个数
  • 如果当前集合元素数量大于等于3:
  1. 使用臭皮匠排序前2/3的元素
  2. 使用臭皮匠排序后2/3的元素
  3. 再次使用臭皮匠排序前2/3的元素


最差时间复杂度 O(nlog 3 /log 1.5)
最差空间复杂度 O(n)

动态图:


代码实现:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.baobaotao.test;  
  2. /**  
  3.  * 排序研究  
  4.  * @author benjamin(吴海旭)  
  5.  * @email benjaminwhx@sina.com / 449261417@qq.com  
  6.  *  
  7.  */  
  8. public class Sort {  
  9.     /**  
  10.      * 臭皮匠排序  
  11.      * @param array  
  12.      */  
  13.     public static void stoogeSort(int[] array) {  
  14.         stoogeSort(array, 0, array.length-1) ;  
  15.     }  
  16.       
  17.     /**  
  18.      * 重载臭皮匠排序  
  19.      * @param array  
  20.      * @param low  
  21.      * @param high  
  22.      */  
  23.     public static void stoogeSort(int[] array, int low, int high) {  
  24.         printArr(array) ;  
  25.         if(array[low] > array[high]) {  
  26.             swap(array, low, high) ;  
  27.         }  
  28.         if(low + 1 >= high) return ;  
  29.         int third = (high-low+1)/3 ;  
  30.         stoogeSort(array, low, high-third) ;  
  31.         stoogeSort(array, low+third, high) ;  
  32.         stoogeSort(array, low, high-third) ;  
  33.     }  
  34.     /**  
  35.      * 按从小到大的顺序交换数组  
  36.      * @param a 传入的数组  
  37.      * @param b 传入的要交换的数b  
  38.      * @param c 传入的要交换的数c  
  39.      */  
  40.     public static void swap(int[] a, int b, int c) {  
  41.         if(b == c) return ;  
  42.         int temp = a[b] ;  
  43.         a[b] = a[c] ;  
  44.         a[c] = temp ;   
  45.     }  
  46.       
  47.     /**  
  48.      * 打印数组  
  49.      * @param array  
  50.      */  
  51.     public static void printArr(int[] array) {  
  52.         for(int c : array) {  
  53.             System.out.print(c + " ");  
  54.         }  
  55.         System.out.println();  
  56.     }  
  57.       
  58.     public static void main(String[] args) {  
  59.         int[] number={11,95,45,15,78,84,51,24,12} ;  
  60.         stoogeSort(number) ;  
  61.     }  
  62. }  

转载请标注:http://blog.csdn.net/benjamin_whx/article/details/42462485
目录
相关文章
|
4月前
|
搜索推荐 算法 测试技术
数据结构排序——计数排序和排序总结(附上912. 排序数组讲解)
数据结构排序——计数排序和排序总结(附上912. 排序数组讲解)
46 0
|
3月前
|
机器学习/深度学习 搜索推荐
【七大排序】最基础的排序——冒泡排序
【七大排序】最基础的排序——冒泡排序
30 4
|
4月前
|
算法
常见的算法排序(2)
常见的算法排序(2)
37 3
|
4月前
|
搜索推荐
排序——交换排序
排序——交换排序
43 0
|
11月前
|
算法
排序篇(三)----交换排序
排序篇(三)----交换排序
33 0
|
机器学习/深度学习 算法 搜索推荐
【八大排序之插入和选择排序】
【八大排序之插入和选择排序】
85 0
|
搜索推荐 算法
【八大排序之交换与归并排序】(二)
【八大排序之交换与归并排序】(二)
44 0
【八大排序之交换与归并排序】(一)
【八大排序之交换与归并排序】(一)
43 0
|
存储 算法 搜索推荐
【排序】排序这样写才对Ⅰ --插入排序与选择排序
常见的排序算法有这些.将会分成几个章节讲完,感兴趣的uu们可以关注下我的排序专栏,方便和后期观看.
53 0
|
算法
排序(3)之交换排序
今天小编给大家带来交换排序的内容,对于交换排序中的快速排序在理解上会相对困难一点,小编这里会配合图片给大家细细讲解。那么现在就开始我们今天的主题。
60 0