那会儿练手的东西,现在拿出来看,以防忘在硬盘的角落里,写得渣,理解的渣,大神们请忽视
首先是选择排序,
1 public class SelectSort { 2 3 @Test 4 public void selectSort(){ 5 int arr[]={9,5,7,4,8,9,2,1,0}; 6 int min=0; 7 int temp; 8 for (int i = 0; i < arr.length; i++) { 9 min = i; 10 for (int j = i+1; j < arr.length; j++) { 11 if(arr[min]>arr[j]){ 12 min = j; 13 } 14 } 15 if(min!=i){ 16 temp = arr[i]; 17 arr[i] = arr[min]; 18 arr[min] = temp; 19 } 20 } 21 for (int i = 0; i < arr.length; i++) { 22 System.out.println(arr[i]); 23 } 24 } 25 }
当一个无序的数组进行排序时,总是找出最大或者最小的那个元素,把它放到当前待排序子数组的首位或者尾位上,例如上面的例子中,
初始状态: 9,5,7,4,8,9,2,1,0
外层循环执行第一遍: 0,5,7,4,8,9,2,1,9
外层循环执行第二遍: 0,1,7,4,8,9,2,5,9
......
最终: 0,1,2,4,5,7,8,9,9
--------------------------------------------------------------------------------------------------------------------------------------------------------------
然后是插入排序
1 public class InsertSort { 2 3 public static void main(String[] args) { 4 int arr[] = { 9, 5, 7, 4, 8, 9, 2, 1, 0 }; 5 int temp; 6 for (int i = 0; i < arr.length-1; i++) { 7 int k = i+1; //当前待插入的索引,前面的那些个值已经是有序的了 8 temp =arr[k]; //缓存待插入的值 9 while(k>0&&temp<arr[k-1]){ 10 arr[k] = arr[k-1]; 11 k--; 12 } 13 arr[k] = temp; 14 } 15 16 for (int i = 0; i < arr.length; i++) { 17 System.out.print(arr[i]); 18 } 19 } 20 21 }
插入排序的想法就是,把待插入的当前值插入到已经有序的子数组(或者字串)中的"合适的位置",来完成排序,上面的插入排序很笨拙,每次插入的时候都要整体挪动一部分子数组...以后想想,找找优化,今天主要是来贴代码的...
接下来是快速排序
1 public class QuickSortDemo { 2 static char a[] = { ‘d‘, ‘x‘, ‘a‘, ‘r‘, ‘p‘, ‘j‘, ‘i‘, ‘k‘, ‘m‘, ‘y‘, ‘b‘ }; 3 public static void qsort(char items[]) 4 { 5 qs(items, 0, items.length - 1); 6 } 7 8 //主要实现 9 private static void qs(char items[], int left, int right) { 11 int i, j, k; 12 char x, y; 13 i = left; // 使用i记录从左向右扫描的下标 14 j = right; // 使用j记录从右向左扫描的下标 15 x = items[(left + right) / 2]; // 使用中间位对应的值作为标准,存入x中 16 do { 17 while ((items[i] < x) && (i < right)) 18 i++; // 当第i个数的值大于mid时,或从左向右扫描结束时 19 // 循环停止 20 while ((items[j] > x) && (j > left)) 21 j--; // 当第j个数的值小于mid时,或从右向左扫描结束时 22 // 循环停止 23 if (i <= j) { 24 y = items[i]; // 当遇到有第i个的值大于mid,有第j个的值小于mid时 25 items[i] = items[j]; // 将第i个数和第j个数进行交换 26 items[j] = y; // 交换之后,i,j按原方向向下一个数扫描 27 i++; 28 j--; 29 } 30 31 } while (i < j); // 从左向右和从右向左扫描相遇后,停止 32 if (i < right) 33 qs(items, i, right); // 继续从右半边扫描 34 if (j > left) 35 qs(items, left, j); // 继续从左半边扫描 36 } 37 38 public static void main(String[] args) { 39 qsort(a); 40 for (int j = 0; j < a.length; j++) { 41 System.out.print(a[j]); 42 } 43 } 44 }
这个实的代码啰啰嗦嗦,想法就一个,选定一个基准值(代码里选取的是待排序数组的中间位置的值),升序的情况下,所有比基准值大,都应该在在基准值的右边,比基准小的,都应该在基准的左边,左右两边相向扫描,重复这个过程,直到左右两边的扫描位置碰头,扫描停止
原文:http://www.cnblogs.com/fallen-rise/p/3690395.html