快排和冒泡

手写快排和冒泡

快速排序

  • 第一种写法
    public static int[] qsort1(int arr[], int start, int end) {
        int i = start;//定义起点
        int j = end;//定义终点
        int key = arr[start];//一开始先选择第一个数为要比较的值

        while (i < j) {//i,j相遇才退出循环
            while ((i < j) && arr[j] > key) {//从右往左遍历,直到找到一个比key小或等于key的值
                j--;
            }
            while ((i < j) && arr[i] < key) {//从左往右遍历,直到找到一个比key大或等于key的值,第一个值一般会与最先找到的j处的值交换(除非j处的值与key相等)
                i++;
            }
            if ((arr[i] == arr[j]) && (i < j)) {//如果i,j处的值与key相等,就不用交换
                i++;//遇此情况,i自增
            } else {//如果不相等,或者i,j相遇,交换两个i,j两个索引处的值
		int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
	//递归调用
        if (i - 1 > start) arr = qsort1(arr, 0, i - 1);
        if (j + 1 < end) arr = qsort1(arr, j + 1, end);

        return arr;
    }
  • 第二种写法
    public static int[] qsort2(int arr[], int start, int end) {

        int i = start;
        int j = end;
        int key = arr[i];

        while (i < j) {
            while ((i < j) && arr[j] > key) {
                j--;
            }
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }
            while ((i < j) && arr[i] < key) {
                i++;
            }
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        arr[i] = key;

        if (i - 1 > start) arr = qsort2(arr, 0, i - 1);
        if (j + 1 < end) arr = qsort2(arr, j + 1, end);

        return arr;
    }

冒泡排序

    public static int[] bolbsort(int arr[], int start, int end) {

        int i = start;
        int j = end;
        while (i < j) {
            if (arr[i] > arr[i + 1]) {
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                i++;
            } else {
                i++;
            }
        }

        if (j - 1 > start) arr = bolbsort(arr, start, j - 1);
        return arr;
    }
//自己优化的版本,做一个判断,如果一次遍历中没有做交换,即已经排好序了,就不用再冒泡了
    public static int[] bolbsort(int arr[], int start, int end) {

        int i = start;
        int j = end;
        Boolean b=false;

        while (i < j) {
            if (arr[i] > arr[i + 1]) {
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                i++;
                b=true;
            } else {
                i++;
            }
        }

        if (b){
            if (j - 1 > start) arr = bolbsort(arr, start, j - 1);
        }
        return arr;
    }
posted @ 2021-03-16 16:59  shaon111  阅读(97)  评论(0)    收藏  举报