首页 > 其他 > 详细

几个常见排序和查找简单实现

时间:2014-04-29 08:59:19      阅读:266      评论:0      收藏:0      [点我收藏+]

那会儿练手的东西,现在拿出来看,以防忘在硬盘的角落里,写得渣,理解的渣,大神们请忽视

首先是选择排序,

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

当一个无序的数组进行排序时,总是找出最大或者最小的那个元素,把它放到当前待排序子数组的首位或者尾位上,例如上面的例子中,

  初始状态:      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  

 --------------------------------------------------------------------------------------------------------------------------------------------------------------

然后是插入排序

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

插入排序的想法就是,把待插入的当前值插入到已经有序的子数组(或者字串)中的"合适的位置",来完成排序,上面的插入排序很笨拙,每次插入的时候都要整体挪动一部分子数组...以后想想,找找优化,今天主要是来贴代码的...

接下来是快速排序

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

这个实的代码啰啰嗦嗦,想法就一个,选定一个基准值(代码里选取的是待排序数组的中间位置的值),升序的情况下,所有比基准值大,都应该在在基准值的右边,比基准小的,都应该在基准的左边,左右两边相向扫描,重复这个过程,直到左右两边的扫描位置碰头,扫描停止

几个常见排序和查找简单实现,布布扣,bubuko.com

几个常见排序和查找简单实现

原文:http://www.cnblogs.com/fallen-rise/p/3690395.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!