排序
直接排序
原理:
把n个待排序的元素看成一个有序表和一个无需表,开始的时候有序表只有1个元素,无序表中有n-1个元素
每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。
时间复杂度
直接插入排序是稳定排序,不需要额外内存,空间复杂度O(1)。时间复杂度,最佳情况:O(n) 最差情况:O(n^2) 平均情况:O(n^2)。
public class Main {
public static void main(String[] args){
int[] a = {22,1,55,33,101,66,77,99,10,100};
insertSort(a);
}
private static void insertSort(int[] a) {
// TODO Auto-generated method stub
for(int i=1;i<a.length;i++) {
int b = a[i];
int j=i-1;
while(j>=0&&a[j]>b) {
a[j+1] = a[j];
j--;
}
a[j+1] = b;
}
for(int i = 0;i<a.length;i++) {
System.out.println(a[i]);
}
}
}
冒泡排序
原理:
冒泡排序的原理(以递增序为例)是每次从头开始依次比较相邻的两个元素,如果后面一个元素比前一个要大,说明顺序不对,则将它们交换,本次循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,说明每个元素都不比它后面的元素大,至此排序完成。
由于冒泡排序简洁的特点,它通常被用来对于计算机程序设计入门的学生介绍算法的概念。
时间复杂度:
若文件的初始状态是排好序的的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数 M 均达到最小值(Cmin = n-1、Mmin = 0),所以,冒泡排序最好的时间复杂度为O(N)。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] list = {12,13,11,15,55,8,99,33,95,112,1};
for(int i = 1;i<list.length;i++) {
for(int j = 0;j<list.length-i;j++) {
if(list[j] >list[j+1]) {
int temp;
temp=list[j];
list[j]= list[j+1];
list[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(list));
}
}
快速排续
快速排序,顾名思义,速度快;其时间复杂度为(NlogN),那么它是如何运作来实现高速排序的呢?先讲一下它的基本原理:
(1)寻找到一个枢纽元,也就是在一组元素中找一个元素(怎么找是有讲究的);
(2)然后在这组元素中,比这个枢纽元小的放在左边,比其大的放在右边;
(3)然后对左右重复上述两步,即可实现从小到大排序;
这三个步骤中有两个问题非常有意思。
第一:如果这个枢纽元是这组元素的最大值或是最小值,那么所有的元素都在枢纽元的一侧,所以这是最坏的一种情况,但是还能接受,因为后面递归的选取枢纽元你应该会选取到一个不大不小的枢纽元的吧。要不然,你总不会每次都很幸运的选取到那个最大的或是最小的枢纽元吧,要是这样,你可以去买彩票了。所以,是可以随便选的,一般选取第一个数,或是随机选。
第二:还是这个枢纽元的问题,假如啊,你选取的这个枢纽元在这组元素中有重复值啊,比方说这组元素中有三个8,你选取的枢纽元恰好是8,按照规则:比8小的放在左边,比8大的放在右边,那么问题来了,等于8的放在哪边?这是我们的处理是要么全放在左边,要么全放在右边。
时间复杂度:
快速排续时间复杂度为n*(lgn)
代码
import java.util.Scanner;
public class 快速排序 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// int n = input.nextInt();
int[] list = {12,13,11,15,55,8,99,33,95,112,1};
quickSort(list,0,list.length-1);
for(int i=0;i<list.length;i++)
System.out.println(list[i]);
}
private static void quickSort(int[] list, int low, int high) {
// TODO Auto-generated method stub
if(low>=high) {
return;
}
int i,j,temp,t;
i = low;
j = high;
temp = list[i];
while(i<j) {
while(temp<=list[j]&& i<j) {
j--;
}
while(temp>=list[i]&& i<j) {
i++;
}
if(i<j) {
t = list[j];
list[j] = list[i];
list[i] =t;
}
}
list[low] = list[i];
list[i] = temp;
quickSort(list,low,i-1);
quickSort(list,i+1,high);
}
}
选择排序
原理
选择排序原理即是,遍历元素找到一个最小(或最大)的元素,把它放在第一个位置,然后再在剩余元素中找到最小(或最大)的元素,把它放在第二个位置,依次下去,完成排序。
时间复杂度
时间复杂度为O(n^2)
代码
public class Main {
public static void main(String[] args) {
int index,temp;
int[] list = {12,13,11,15,55,8,99,33,95,112,1};
for(int i=0;i<list.length;i++) {
index= i;
for(int j=i+1;j<list.length;j++) {
if(list[j]<list[index]) {
index = j;
}
}
if(index!=i) {
temp = list[i];
list[i]= list[index];
list[index]=temp;
}
}
for(int i=0;i<list.length;i++)
System.out.println(list[i]);
}
}