冒泡排序
冒泡排序依次比较相邻的两个数字,将小数放在前面,大数放在后面。第一趟:比较第一和第二个数,小数放前,大数放后;接下来比较第二个数和第三个数,依然小数放前,大数放后;依次类推,直到最后两个数,这样最大的数就放在了最后一个位置。第二趟:比较第一个和第二个数,小数放前,大数放后,直到倒数第二个数。…重复上述过程,直至排序完成。
具体实现如下所示:
public static void bubbleSort(int[] array){
if (array.length <= 1) return;
int temp;
for(int i=0 ; i<array.length-1 ; i++){
for (int j = 0; j<array.length-i-1; j++){
if (array[j] > array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
public static void main(String[] args) {
int[] array = {10, 7, 2, 4, 7, 62, 3, 4, 2, 1, 19};
bubbleSort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
过程示意图如下所示:
冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。
插入排序
假设第一个位置上是已经排好序的,这样仅需对1~n-1位置上的元素进行排序,将它们插入到正确的位置。每次遍历的任务是:通过扫描前面已排序的子列表,将位置i处的元素定位到从0到i的子列表之内的正确的位置上。
具体实现如下所示:
public static void insertSort(int[] array){
int i,j,target;
for (i=1; i<array.length ; i++){
j=i;
target = array[i];
while (j>0 && target < array[j-1]){
array[j] = array[j-1];
j--;
}
array[j] = target;
}
}
public static void main(String[] args) {
int[] array = {10, 7, 2, 4, 7, 62, 3, 4, 2, 1, 19};
insertSort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
过程示意图如下所示:
插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。
选择排序
经过第一轮比较后,将最小的值与第一个位置的值进行交换;第二轮比较排除第一个位置的元素,比较剩余元素的最大值,然后和第二个位置进行交换,以此类推,直至排好序。
具体代码如下所示:
public static void selectionSort(int[] array) {
int target,temp;
for (int i = 0; i < array.length; i++) {
target = i;
for (int j = i + 1; j < array.length; j++) {
if (array[target] > array[j]) target = j;
}
if (target != i){
temp = array[target];
array[target] = array[i];
array[i] = temp;
}
}
}
public static void main(String[] args) {
int[] array = {10, 7, 2, 4, 7, 62, 3, 4, 2, 1, 19};
selectionSort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
过程示意图如下所示:
选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。