算法实战java实现插入排序,堆排序,归并排序
2017-10-21 16:52
791 查看
插入排序
直接插入排序
原理
每一个元素插入它前面排序好的元素中
java实现
//直接插入排序,由小到大 void inserSort( int[] list) { int j; for( int p = 1; p < list.length; p++ ) { int temp = list[p]; //比较当前位置与前面一个的大小, 如果当前位置较小与前一个交换。 for ( j = p; j > 0 && temp - list[ j - 1] < 0; j--) list[j] = list[j-1]; list[j] = temp; } }
希尔排序(缩减增量排序)
原理
对间隔中的数进行直接插入排序排序,间隔慢慢减低,最后到1.
java实现
//希尔排序。(缩减增量排序) void shellsort( int [] a) { int j; for (int gap = a.length /2; gap > 0; gap /= 2) //对每个gap间隔的数组进行直接插入排序 for( int i = gap; i < a.length; i++) { int temp = a[i]; for( j = i; j >= gap && temp - a[j-gap] < 0; j-=gap) a[j] = a[j-gap]; a[j] = temp; } }
堆排序
原理
在本人之前的二叉堆这种数据结构的基础上,进行排序。java实现
public class HeapSort { //构建小顶堆 public HeapSort( int [] items ) { currentSize = items.length; //确定array'数组'的大小 array = new int[(currentSize + 2) * 11 /10]; sorted = new int[currentSize]; int i = 1; // for xx in list : for( int item : items) //第一个空位留下 array[ i++ ] = item; buildHeap(); } //按由小到大的顺序。排列 public void heapsort() { int i =0; while ( currentSize > 0 ) { sorted[i] = this.deleteMin(); i++; } System.out.println("排序完成"); } public int deleteMin() { int minVal = array[1]; array[1] = array[ currentSize]; currentSize--; percolateDown( 1 ); return minVal; } private int currentSize; private int[] array; //存放排序好的数组 private int[] sorted; // 对于数组任一位置i的元素, 左儿子在2i,右儿子在2i+1, 父在 i/2 private void buildHeap() { for( int i = currentSize /2; i > 0; i-- ) percolateDown( i ); } private void percolateDown( int hole) { int child; int temp = array[ hole ]; for ( ; hole * 2 <= currentSize; hole = child) { child = hole * 2; if ( child != currentSize && array[child + 1] - (array[child]) < 0) child++; if ( array[child]- temp < 0) array[hole] = array[child]; else break; } array[hole] = temp; } }
归并排序
原理
A,B为排序的列表
c为排序好的列表
x,y指向的数进行对比,小的数保存在c中。z和小的个指针更新自己。若A或B那个先用完,将另一个剩下直接放在c中。
java实现
public class MergeSort { public MergeSort(int[] list) { sort(list, 0, list.length - 1); } //递归的将一个大数组转变为小数组 void sort( int[] list, int left, int right) { //递归退出条件 if (left >= right) return; //找出中间索引值 int center = (left + right) /2; sort(list,left, center ); sort(list, center + 1, right ); //合并排序好的数组 merge( list, left, center, right); } //归并, void merge( int[] list, int left, int center, int right ) { int[] tempArray = new int[list.length]; //右数组第一个元素索引 int rightStart = center + 1; //左数组第一个元素的索引 int leftStart = left; // third 记录临时数组的索引 int third = left; while( leftStart <= center && rightStart <= right ) //如果leftPos 处的数《= rightPos处的数, 将leftPos 处的数保存在tempArray中 if (list[leftStart] - list[rightStart] <= 0) tempArray[third++] = list[leftStart++]; else tempArray[third++] = list[rightStart++]; //如果左右俩组数组哪一组先用完 //左组未用完 while ( leftStart <= center ) tempArray[third++] = list[leftStart++]; //右组未用完 while ( rightStart <= right ) tempArray[third++] = list[rightStart++]; //将排序好的数组覆盖原数组 while( left <= right) list[ left ] = tempArray[ left++ ]; } }
相关文章推荐
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 插入排序,希尔排序,堆排序,归并排序,快速排序Java实现
- java实现七种排序 (插入排序, 希尔排序, 插入排序, 快速排序, 简单选择排序, 堆排序, 归并排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- MergeSort(归并排序)算法Java实现
- Java实现快速排序、归并排序、堆排序
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序
- 自主实现的Java实现的构造大小堆、堆排序的算法
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- 用Java实现归并排序(Merge-Sort)算法
- 日学一算法---归并排序(java实现)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 【转】排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序