Chinaunix首页 | 论坛 | 博客
  • 博客访问: 349232
  • 博文数量: 255
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 2526
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-06 22:04
  • 认证徽章:
个人简介

Linuxer, ex IBMer. GNU https://hmchzb19.github.io/

文章分类

全部博文(255)

文章存档

2018年(25)

2017年(80)

2016年(80)

2015年(58)

2014年(1)

2013年(8)

2012年(3)

分类: Java

2017-03-22 11:57:33

把一些Java实现的Sort整合一下,不过还缺少TimSort, HeapSort 这些,python 默认的Sort 是使用的TimSort.
第一个Selection Sort 是自己写的,和后面的Selection Sort不同在于,这个版本多了个swap方法来交换两个element.
并且这个版本是外层循环每次都找到一个最小的,放在数组最前面。

点击(此处)折叠或打开

  1. package Algorithms;

  2. public class SelectionSort {

  3.     private static void swap(int indexA, int indexB, int[] arr){
  4.         int temp;
  5.         temp=arr[indexA];
  6.         arr[indexA]=arr[indexB];
  7.         arr[indexB]=temp;
  8.     }

  9.     public static void selectionSort(int arr[]){
  10.         int minIndex;
  11.         for(int i=0;i<=arr.length-2;i++){
  12.             minIndex=i;
  13.             for(int j=i+1;j<=arr.length-1;j++){
  14.                 if(arr[minIndex] > arr[j]){
  15.                     minIndex=j;
  16.                 }
  17.             }
  18.             swap( i, minIndex, arr);
  19.         }
  20.     }

  21.     public static void main(String[] args) {
  22.         int arr[]= new int[]{5,3,1,10, 7,6, 12, 0};
  23.         selectionSort(arr);
  24.         for(int i: arr){
  25.             System.out.print(i+" ");
  26.         }
  27.     }
  28. }


点击(此处)折叠或打开

  1. package Sort;

  2. import java.util.Arrays;
  3. import java.util.Random;

  4. public class ArraySort {
  5.     public static void SelectionSort(int[] arr){
  6.         int index;
  7.         for(int i=1;i<arr.length;i++){
  8.             index=0;
  9.             for(int j=1;j<=arr.length-i;j++){
  10.                 if(arr[j] > arr[index]){
  11.                     index=j;        //find max assign to index
  12.                 }
  13.             }
  14.             //swap arr.length-i and index (max)
  15.             int temp=arr[arr.length-i];
  16.             arr[arr.length-i]=arr[index];
  17.             arr[index]=temp;
  18.         }
  19.     }
  20.     
  21.     public static void insertSort(int[] arr){
  22.         for(int i=1;i<arr.length;i++){
  23.             int key=arr[i];
  24.             int j = i-1;
  25.             while(j>=0 && key < arr[j]){
  26.                 arr[j+1]=arr[j];
  27.                 j--;
  28.             }
  29.             arr[j+1]=key;
  30.         }
  31.     }
  32.     
  33.     public static void BubbleSort(int[] arr){
  34.         for(int i=1;i<arr.length;i++){
  35.             //比较相邻两个元素,较大的往后冒泡
  36.             for(int j=0;j<arr.length-i;j++){
  37.                 if(arr[j] > arr[j+1]){
  38.                     int temp=arr[j];
  39.                     arr[j]=arr[j+1];
  40.                     arr[j+1]=temp;
  41.                 }
  42.             }
  43.         }
  44.     }
  45.             
  46.     public static void quickSort(int arr[],int lowIndex,int highIndex){
  47.         int lo=lowIndex;
  48.         int hi=highIndex;
  49.         int mid;
  50.         if(highIndex > lowIndex){
  51.             mid=arr[(lowIndex+highIndex)/2];    //pivot
  52.             while(lo <= hi){
  53.                 while((lo<highIndex) && (arr[lo] < mid))
  54.                     ++lo;
  55.                 while((hi>lowIndex) && (arr[hi]> mid))
  56.                     --hi;
  57.                 if(lo <= hi){
  58.                     swap(arr,lo,hi);
  59.                     ++lo;
  60.                     --hi;
  61.                 }
  62.             }
  63.             if(lowIndex < hi)
  64.                 quickSort(arr, lowIndex, hi);
  65.             if(lo < highIndex)
  66.                 quickSort(arr, lo, highIndex);
  67.         }
  68.         
  69.     }
  70.     
  71.     private static void swap(int arr[] ,int i, int j){
  72.         int temp= arr[i];
  73.         arr[i]=arr[j];
  74.         arr[j]=temp;
  75.     }
  76.     
  77.     
  78.     public static void randomFill(int[] data,int max){
  79.         Random gen = new Random();
  80.         for(int i=0;i<data.length;i++){
  81.             data[i]=gen.nextInt(max);
  82.         }
  83.     }

  84.     public static void main(String[] args){
  85.         int[] data = new int[10];
  86.         randomFill(data , 1000);
  87.         System.out.println(Arrays.toString(data));
  88.         System.out.println("after sort");
  89.         //insertSort(data);
  90.         //SelectionSort(data);
  91.         //bubbleSort(data);
  92.         quickSort(data,0, data.length-1);
  93.         System.out.println(Arrays.toString(data));
  94.     }
  95. }
2. 最近看到个有趣的题目, 传入一个String 看看是否能转化为Numeric .
http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Java
这里有很多的代码实现,我测试下了Java的一些实现.

点击(此处)折叠或打开

  1. package hezhb_test;

  2. import java.text.NumberFormat;
  3. import java.text.ParsePosition;
  4. import java.util.Scanner;

  5. public class IsNumeric {
  6. //Determine a String is a Numeric or not
  7.         
  8.     public static boolean isNumeric(String inputData) {
  9.         return inputData.matches("[-+]?\\d+(\\.\\d+)?");
  10.     }
  11.         
  12.     public static boolean isNumeric2(String inputData) {
  13.         if (inputData.equals("")){
  14.             return false;
  15.         }
  16.         NumberFormat formatter = NumberFormat.getInstance();
  17.         ParsePosition pos = new ParsePosition(0);
  18.         formatter.parse(inputData, pos);
  19.         return inputData.length() == pos.getIndex();
  20.     }
  21.         
  22.     public static boolean isNumeric3(String input){
  23.         Scanner s = new Scanner(input);
  24.         return s.hasNextInt();
  25.     }
  26.         
  27.     public static void main(String[] args) {
  28.     // TODO Auto-generated method stub
  29.             
  30.         System.out.println(isNumeric("-1999.456"));
  31.         System.out.println(isNumeric(""));
  32.         System.out.println(isNumeric2("-1999.456"));
  33.         System.out.println(isNumeric2(""));
  34.         System.out.println(isNumeric3("-1999"));
  35.         System.out.println(isNumeric3(""));
  36.         }
  37.     }
结果如下,isNumeric3 这个函数只能处理整数, 而isNumeric2 我在其中增加了判断是不是空的字符串,为空则直接返回false, 这个地方有待商榷,到底空字符串应该理解为数字0 ,还是不能看作为一个数字呢.
综上感觉前两个实现比较好,如果空字符串可以看作数字0,那么isNumeric2 很适用,否则用正则表达式很适用, 正则表达式的问题是太多的反斜线太难看懂了, Python的re.compile(r"") 裸字符串可以少写一个"\",
Java我还不清楚怎么写简单些.

点击(此处)折叠或打开

  1. true
  2. false
  3. true
  4. false
  5. true
  6. false

3. 贴一个linux下cal命令的Java实现.

点击(此处)折叠或打开

  1. package hezhb_test;

  2. import java.time.DayOfWeek;
  3. import java.time.LocalDate;

  4. //A implementation of Linux command "cal":
  5. public class Cal {

  6.     public static void main(String[] args) {
  7.         // TODO Auto-generated method stub
  8.         LocalDate date = LocalDate.now().withDayOfMonth(1);
  9.         int month;
  10.         if(args.length >= 2){
  11.             month=Integer.parseInt(args[0]);
  12.             int year = Integer.parseInt(args[1]);
  13.             date=LocalDate.of(year,month,1);
  14.         }else{
  15.             month=date.getMonthValue();
  16.         }
  17.         
  18.         System.out.println(" Mon Tue Wed Thu Fri Sat Sun");
  19.         DayOfWeek weekday = date.getDayOfWeek();
  20.         int value = weekday.getValue();
  21.         for(int i=1;i<value;i++){
  22.             System.out.print(" ");
  23.         }
  24.         while(date.getMonthValue() == month){
  25.             System.out.printf("%4d", date.getDayOfMonth());
  26.             date = date.plusDays(1);
  27.             if(date.getDayOfWeek().getValue() ==1)
  28.                 System.out.println();
  29.         }
  30.         if(date.getDayOfWeek().getValue()!= 1){
  31.             System.out.println();
  32.         }
  33.     }
  34. }


阅读(1680) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册