一、排序算法

1、冒泡排序

依次比较相邻元素的大小

  1. public static void sort(int arr[]){
  2. for (int i = 0 ;i<arr.length-1;i++){
  3. for (int j = 0; j <arr.length-1-i; j++) {
  4. if(arr[j]>arr[j+1]){
  5. int temp = arr[j];
  6. arr[j] = arr[j + 1];
  7. arr[j + 1] = temp;
  8. }
  9. }
  10. }
  11. }

2、选择排序

选择一个元素,依次与之后的元素比较

  1. public static void sort(int arr[]){
  2. for (int i = 0 ;i<arr.length-1;i++){
  3. for (int j = i+1; j <arr.length; j++) {
  4. if(arr[i]>arr[j]){
  5. int temp = arr[i];
  6. arr[i] = arr[j];
  7. arr[j] = temp;
  8. }
  9. }
  10. }
  11. }

3、插入排序

将数组分为有序表(第一次只包含数组下标为0的一个元素)和无序表,从无序表中选取第一个元素插入到有序表的对应位置。

方法一

  1. public static void sort(int arr[]){
  2. for (int i = 1; i < arr.length; i++) {
  3. if(arr[i]<arr[i-1]){
  4. int temp = arr[i];
  5. for (int j = i-1; j >= 0; j--) {
  6. if(arr[j]>temp){
  7. arr[j + 1] = arr[j];
  8. }else{
  9. break;
  10. }
  11. arr[j] = temp;
  12. }
  13. }
  14. }
  15. }

方法二

  1. public static void sort(int arr[]){
  2. for (int i = 1; i < arr.length; i++) {
  3. int insertVal = arr[i];
  4. int insertIndex = i-1;
  5. while(insertVal<arr[insertIndex] && insertIndex>=0){
  6. arr[insertIndex + 1] = arr[insertIndex];//比插入值大的元素后移一位
  7. insertIndex--;
  8. }
  9. if(insertIndex+1 != i){
  10. arr[insertIndex + 1] = insertVal;
  11. }
  12. }
  13. }

4、希尔排序

分组的插入排序

  1. public static void shellSort2(int []arr) {
  2. //定义一个变量用于交换值
  3. int temp=0;
  4. //gap为步长,每次步长为上一次的1/2,通过步长将数组分组
  5. for(int gap=arr.length/2;gap>0;gap/=2) {
  6. //i为数组中第一个步长之后的数据
  7. for(int i=gap;i<arr.length;i++) {
  8. int j=i;
  9. temp=arr[j];
  10. //同插入排序,需要插入的值从后往前依次比较,找到插入的位置,
  11. while(j-gap>=0 && temp<arr[j-gap]) {
  12. arr[j]=arr[j-gap];
  13. j=j-gap;
  14. }
  15. arr[j]=temp;
  16. }
  17. }
  18. }

5、快速排序

以数组的第一个元素为标准数,比标准数小的放在左边,比标准数大的数放在右边

然后以标准数分组递归。

  1. public static void sort(int arr[],int start ,int end){
  2. if(start<end){
  3. int sign = arr[start];
  4. int low = start;
  5. int high = end;
  6. while(low<high){
  7. while(low<high && arr[high]>=sign){
  8. high--;
  9. }
  10. arr[low] = arr[high];
  11. while(low<high && arr[low]<=sign){
  12. low++;
  13. }
  14. arr[high] = arr[low];
  15. }
  16. arr[low] = sign;
  17. sort(arr,start,low-1);
  18. sort(arr,low+1,end);
  19. }
  20. }

6、基数排序

空间换时间的经典算法,将所有数统一为相同的长度,数位短的前面补零。然后从最低位开始排序,依次到最高位。

  1. public static void sort(int arr[]){
  2. int max = arr[0];
  3. for (int i = 1; i < arr.length; i++) {
  4. if(arr[i]>max){
  5. max = arr[i];
  6. }
  7. }
  8. int maxLength = (max + "").length();
  9. //定义一个二维数组,表示10个桶,每个桶就是一个数组
  10. int[][] bucket = new int[10][arr.length];
  11. //定义一个一维数组记录每个桶存放的数据个数。
  12. int[] elementsCount = new int[10];
  13. //数据存入桶中
  14. for (int i = 0, n=1; i < maxLength; i++,n=n*10) {
  15. for(int j=0;j<arr.length;j++){
  16. int element = arr[j] / n % 10;
  17. bucket[element][elementsCount[element]] = arr[j];
  18. elementsCount[element]++;
  19. }
  20. //从桶中取出数据
  21. int index = 0;
  22. for (int k = 0; k < 10; k++) {
  23. if(elementsCount[k]!=0){
  24. for (int m = 0; m <elementsCount[k] ; m++) {
  25. arr[index++] = bucket[k][m];
  26. }
  27. }
  28. //将对应桶的计数清零
  29. elementsCount[k] = 0;
  30. }
  31. }
  32. }

二、二分查找

  1. public static int search(int arr[],int target){
  2. int left = 0;
  3. int right = arr.length-1;
  4. while(left<right){
  5. int mid = (right+left)/2;
  6. if(arr[mid]==target){
  7. return mid;
  8. }else if(arr[mid]<target){
  9. left = mid+1;
  10. }else{
  11. left = mid + 1;
  12. }
  13. }
  14. return -1;
  15. }