冒泡排序
思想:由数组头部开始,一次比较两个元素,如果他们的顺序错误就把他们交换过来。每次交换完成后,当前数组最大值就会被放在最后。
时间复杂度:O(n2)
private void bubbleSort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length-1-i;j++){
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
选择排序
思想:每一趟从待排序序列选择一个最小的元素放到已排好序序列的末尾,剩下的为待排序序列,重复上述步骤直到完成排序。
时间复杂度:O(n2)
private void selectSort(int[] array) {
for (int i = 0; i < array.length; i++) {
int min = i; //最小值索引
for (int j = i; j < array.length; j++) {
if (array[j] < array[min]) min = j;
}
int temp = array[i];//交换最小值与array[i]
array[i] = array[min];
array[min] = temp;
}
}
插入排序
思想:假设数列第一个元素为已排序数列,剩余数列为未排序将待排序元素挨个插入到已排序数列中每次插入都必须保证数列是有序的,即通过比较和移动有序数列中的元素,将元素插入到合适的位置
时间复杂度:O(n2)
private void insertSort(int[] a) {
for (int i = 1; i < a.length; i++) {
int insert = a[i];
int j = i;
//j>=1防止下标越界
while (j >= 1 && a[j - 1] > insert) {
a[j] = a[j - 1];
j--;
}
a[j] = insert;
}
}
快速排序
思想:先从数列中取出一个数作为基准数。分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。再对左右区间重复第二步,直到各区间只有一个数。
时间复杂度:O(n*logn)
private void fastSort(int[] array) {
sortJob2(array, 0, array.length - 1);
}
private void sortJob(int[] array, int low, int high) {
if (low > high) return; //递归出口
int i = low, j = high, temp, key = array[low];
while (i < j) {
//一次交换两个非key值
while (i < j && array[j] > key) j--;
while (i < j && array[i] <= key) i++;
if (i < j) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
//交换Key和中间位置
temp = array[i];
array[i] = array[low];
array[low] = temp;
//递归
sortJob(array, low, i - 1);
sortJob(array, i + 1, high);
}