数据结构与算法-算法基础一
先介绍四种排序算法:插入排序、简单选择排序、冒泡排序、归并排序。
插入排序
1 /** 2 * 插入排序,在前k个元素有序的前提下插入arr[k],将前面有序元素依次与arr[k]比较、移动, 3 * 最终将arr[k]插入有序元素中的合适位置,形成k+1个有序元素 4 */ 5 @org.junit.Test 6 public void testInsert() { 7 for(int i=1; i<arr.length; i++) { 8 int temp = arr[i]; 9 int j = i; 10 for(; j>0&&temp<arr[j-1]; --j) { 11 arr[j] = arr[j - 1]; 12 } 13 arr[j] = temp; 14 } 15 }
简单选择排序
1 /** 2 * 简单选择排序,每次遍历选出min与相应位置元素交换,每次遍历都可确定一个元素的最终位置 3 */ 4 @org.junit.Test 5 public void testSimpleSelect() { 6 for(int i=0; i<arr.length-1; i++) { 7 int min = i; 8 for(int j=i+1; j<arr.length; j++) { 9 if (arr[min] > arr[j]) { 10 min = j; 11 } 12 } 13 int t = arr[min]; 14 arr[min] = arr[i]; 15 arr[i] = t; 16 } 17 }
冒泡排序
1 /** 2 * 冒泡排序,与相邻的元素比较大小并交换,每一轮比较都会确定一个元素的最终位置 3 */ 4 @org.junit.Test 5 public void testBubble() { 6 for(int i=arr.length-1; i>0; i--) { 7 for(int j=0; j<i; j++) { 8 if (arr[j + 1] < arr[j]) { 9 int t = arr[j + 1]; 10 arr[j + 1] = arr[j]; 11 arr[j] = t; 12 } 13 } 14 } 15 }
归并排序
1 /** 2 * 归并排序,将n个有序序列合并成k(k<n)个有序序列,可结合其他排序使用, 3 * 即先使用其他排序算法进行小范围排序,然后使用归并排序进行合并。 4 */ 5 int i=0, j=0; 6 for(; i<arr.length&&j<arr2.length;) { 7 merged[i+j] = arr[i]>arr2[j]?arr2[j++]:arr[i++]; 8 } 9 if (i >= arr.length) { 10 System.arraycopy(arr2, j, merged, j+i, arr2.length-j); 11 } 12 else if (j >= arr2.length) { 13 System.arraycopy(arr, i, merged, j+i, arr.length-i); 14 }