快速排序:
base:基数,其左边数值都小于它,其右边数值都大于它。
left:左指针
rigt:右指针
/** * 快速排序的一步 * 将大于放右边;小于放左边 * * @param array * @param left * @param right * @return left */ public int sortStep(int[] array, int left, int right) { int base = array[left];//基数 //循环 //将大于放右边 while (left < right) { //结束循环时right对应元素小于基数 while (left < right && array[right] >= base) { right--;//右往左移动 } array[left] = array[right];//赋值 //结束循环时left对应元素大于基数 while (left < right && array[left] <= base) { left++; } array[right] = array[left];//赋值 } array[left]=base; return left; } /** * * 快速排序法 * @param array * @param left * @param right */ public void quickSort(int array[],int left,int right) { //方法递归,自己调用自己形成递归 if (left<right){ int baseModel = sortStep(array, left, right); quickSort(array,left,baseModel-1);//基数左边 quickSort(array,baseModel+1,right);//基数右边 } } /** * 升序 * @param array */ public void sort(int array[]){ quickSort(array,0,array.length-1); }
public static void main(String [] args){
int array[] = {12,45,45,78,6,1,3,7};
sort(array,0,right);
for (int el:array ) { System.out.print(el+" "); }
}
基本思想:
快速排序:
(1)以左边第一个为基数,取出;right从右往左找到一个比基数小的替换左一,
然后,left往右找到一个比right大的数替换;一直循环直到left与right重合将基数赋值。
这时基数左边的数都比它小,右边的数都比它大;
然后左右分别重复执行,直到完全排序完成。
方法的递归:
方法自己调用自己:注意结束条件的设置
统计字母个数:
我的思想是:通过整型一个数组有序的记录各个字母的个数
在根据ASCLL码表将下标转化为字母打印输出。
原理特别简单,主要是注意大小写字母之间有6个其他字符!!!!
public class StrCount { public void counts(String s, int[] sc) { int count=0; for (char i : s.toCharArray()) { if (i >= 97 && i < 97 + 26) { sc[i - 'a' + 32]++; count++; } else if (i >= 65 && i < 65 + 26) { sc[i - 'A']++; count++; } /*if(i>=65 && i<=122) { sc[i-65]++; }*/ if (count==sc.length){ break; } } for (int i = 0; i < sc.length; i++) { char j = (char) (i + 65); if (sc[i] != 0) { System.out.print(sc[i] + "" + j + " "); } } } public static void main(String[] args) { StrCount strCount = new StrCount(); String str = "dhaASHJSHadadjJJJJaGHDGHDzZ"; int sc[] = new int[64]; strCount.counts(str, sc); } }