Java 之排序算法

算法的知识感觉忘的差不多了,记录一下复习的过程,随时更新:

	public int[] testHelper() {  //用来辅助测试
		int a[];
		int n = (int) (Math.random() * 10 + 1);
		a = new int[n];
		for (int i = 0; i < n; i++) {
			a[i] = (int) (Math.random() * 100);
		}
		return a;
	}

	public void selectionSort(int[] a) {

		/*
		 * 扫描整个数组,找到最小的元素并与第一个数进行交换
		 */
		int n = a.length;
		for (int i = 0; i < n - 1; i++) {
			int min = i;
			for (int j = i + 1; j < n; j++) {
				if (a[j] < a[min]) {
					min = j;
				}
			}

			int m;
			m = a[i];
			a[i] = a[min];
			a[min] = m;

		}
	}

	public void bubbleSort(int a[]) {
		/*
		 * 比较相邻元素的大小,如果前一个数大于后一个,则交换位置 最终最大的数沉到最后
		 */
		int n = a.length;
		for (int i = 0; i < n - 1; i++) {
			for (int j = 0; j < n - 1 - i; j++) {
				if (a[j + 1] < a[j]) {
					int m = a[j];
					a[j] = a[j + 1];
					a[j + 1] = m;
				}
			}
		}
	}

	public void insertSort(int a[]) {
		/* 从右到左扫描数组,遇到第一个小于它的数时,将它插在这个数的后面 */
		int n = a.length;
		for (int i = 1; i < n; i++) {
			int v = a[i];
			int j = i - 1;
			while (j >= 0 && a[j] > v) {
				a[j + 1] = a[j];
				j--;
			}
			a[j + 1] = v;
		}
	}

	public void mergeSort(int a[]) {
		/* 将数组一分为二 ,递归排序 */

		int n = a.length;
		if (n > 1) {
			int b[];
			int c[];
			b = new int[n / 2];
			for (int i = 0; i < n / 2; i++) {
				b[i] = a[i];
			}

			if (n % 2 != 0) {
				c = new int[n / 2 + 1];
			} else {
				c = new int[n / 2];
			}
			
			for (int i = n / 2, j = 0; i < n; i++, j++) {
				c[j] = a[i];
			}
			mergeSort(b);
			mergeSort(c);
			merge(b, c, a);
	
		}
	}

	private void merge(int b[], int c[], int a[]) {
		int p = b.length;
		int q = c.length;
		int k = 0, i = 0, j = 0;
		while (i < p && j < q) {
			if (b[i] <= c[j]) {
				a[k] = b[i];
				i++;
			} else {
				a[k] = c[j];
				j++;
			}
			k++;
		}
		if (i == p) {
			for (; j < q; j++, k++) {
				a[k] = c[j];
			}
		} else if (j == q) {
			for (; i < p; i++, k++) {
				a[k] = b[i];
			}
		}

	}


快速排序:

 public void quickSort(int[] a, int l, int r) {
        if (l < r) {
            int s = partition(a, l, r);
            quickSort(a, l, s - 1);
            quickSort(a, s + 1, r);
        }

    }

    private int partition(int a[], int l, int r) {      //找到标志位
        int p = a[l];
        int j = l;
        int m;
        for (int i = l + 1; i <= r; i++) {
            if (a[i] < p) {
                m = a[j + 1];
                a[j + 1] = a[i];
                a[i] = m;
                j++;
            }
        }
        m = a[l];
        a[l] = a[j];
        a[j] = m;
        return j;
    }

快速排序的优化方案较多,因此将优化单独放在一篇文章中:

Java快速排序及优化

猜你喜欢

转载自blog.csdn.net/yforyoung/article/details/80404983