选择排序
将要排序的一组数字进行遍历。
第一次遍历,将第一个位置上的数字与后面的数字进行比较,如果后面的数字比第一个位置上的元素小,则将两个数字的位置进行交换。
第二次遍历,将第二个位置上的数字与后面的数字进行比较,如果后面的数字比第二个位置上的元素小,则将两个数字的位置进行交换。
依次进行遍历、位置交换,直到这组数字排序完成。
假设要遍历数字的个数是n,则需要遍历的次数是n-1
public static void selectSort(int[] arr) {
int temp;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
//每次arr[i]和剩下的所有arr[j]依次比较
if (arr[i] > arr[j]) {
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
}
冒泡排序:
将要排序的一组数字进行遍历。
第一次遍历,将相邻的两个数字进行比较,直到这组数字全部比较完成,如果前面比后面的数字大,则进行交换位置,此时可以将最大的数字筛选出来,放到最后的位置上。也可以将最小的数字筛选出来放到最后一个位置上.
第二次遍历,将相邻的两个数字进行比较,直到这组数字全部比较完成,如果前面比后面的数字大,则进行交换位置,将这组数字里面第二大的数字筛选出来,放到倒数第二的位置上。
依次进行遍历,交换位置,直到排序完成。
public static void bubbleSort(int[] arr) {
int temp;
/*
* for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length -
* 1- i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1];
* arr[j + 1] = temp; } } }
*/
// 第一次循环n-1遍
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
//每次是a[j]和a[j+1]比较,前者小于后者就交换,那么最小的一路交换到最后面,
下次就不考虑最后面的那个数,比较前面几个就可以了,以此类推
if (arr[j] < arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//降序排列,升序的话只需要将if (arr[j] < arr[j + 1])改为if (arr[j] >arr[j + 1])
快速排序:
快速排序基于分治的思想,每次在数列中选取一个基准值,可以选第一个元素
然后定义两个指针,I,J,
当I<J的时候,J从右向左扫描,找比基准值小的值,I从左向右扫描,找比基准值大的值,找到后交换两者的顺序,
这样进行,总有I=J的时候,(条件就是先让J从右向左扫描,再让I从左到右,才能满足I不大于J的条件),这时候让基准值和I位置的变量交换,基准值左边大数全小于它,基准值右边的数全大于它,完成第一次任务
再来吧,既然基准值左边的数都小于它,但还是乱序的,怎么办,对左边的子序列排序,对右边的子序列排序,递归进行,就会排好
代码如下,递归方式下的快速排序
public class QuickSort {
public static void main(String[] args) {
int[] arr = { 4, 1, 7, 6, 3, 5, 4, 4 };
quickSort(arr);
for (int i : arr) {
System.out.print(i + ",");
}
}
public static void quickSort(int[] arr) {
partition(arr, 0, arr.length - 1);
}
public static void partition(int[] arr, int left, int right) {
if (left > right) {
return;
}
int i = left;
int j = right;
// 定义基准值为数组第一个数
int temp = arr[left];
while (i < j) {
// 从右往左找比基准值小的数
while (arr[j] >= temp && i < j) {
j--;
}
// 再从左向右找比基准数大的值,因为j先减小,那么最终交换完成后退出while循环时,i只能等于j
while (arr[i] <= temp && i < j) {
i++;
}
// 如果i<j,交换它们位置的元素
if (i < j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
// 交换基准值和(i==j)处的元素,使基准值到一个中间位置,
// 左边序列都小于基准值,乱序,右边序列都大于基准值,乱序
arr[left] = arr[i];
arr[i] = temp;
// 对左边子序列进行快排
partition(arr, left, i - 1);
// 对右边子序列进行快排
partition(arr, i + 1, right);
}
}