一、插入排序
我们可以把第一个数字看成一个有序数列,从第二个开始循环遍历。在遍历的途中在定义一个循环,不断的与前面的有序数列进行比较,找到位置之后结束本次循环,并将数字插入到有序数列中去,从而达成目的。
代码实现:
public static void insertSort(int[] array) {
for(int i=1;i< array.length;i++){
int j=0;
int temp=array[i];
for(j=i-1;j>=0;j--){
if(temp<array[j]){
array[j+1]=array[j];
}else {
break;
}
}
array[j+1]=temp;
}
}
1234567891011121314
时间复杂度:最坏的情况下为O(N^2),此时整个数列接近逆序。最好情况下为O(N),此时整个数列接近有序。
空间复杂度:O(1);
稳定
插入排序越有序,时间效率越高。
二、 希尔排序
1.先选定一个小于length的整数key作为第一增量,然后将所有距离为key的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量(我们一般是除2),重复整个操作。 2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。
代码实现:
public static void insertSort(int[] array,int val) {
for(int i=val;i< array.length;i++){
int j=0;
int temp=array[i];
for(j=i-val;j>=0;j-=val){
if(temp<array[j]){
array[j+val]=array[j];
}else {
break;
}
}
array[j+val]=temp;
}
}
public static void shellSort(int[] array) {
int key=array.length;
while (key>0){
key=key/2;
insertSort(array,key);
}
}
12345678910111213141516171819202122
时间复杂度:最坏的情况下为O(N2)。最好情况下为O(N),此时整个数列接近有序。平均的情况下为O(N1.3)左右。
空间复杂度:O(1);
不稳定
三、选择排序
思路:
选择排序就是确定一个数组的最小值之后将它固定在起始位置,然后继续循环确定,直到完成为止。
代码实现:
public static void selectSort01(int[] array) {
for(int i=0;i<array.length;i++){
for(int j=i+1;j<array.length;j++){
if(array[i]>array[j]){
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
}
1234567891011
代码优化:
public static void selectSort01(int[] array) {
for(int i=0;i<array.length;i++){
int tmp=i;//把最小的放入tmp中,进行交换
for(int j=i+1;j<array.length;j++){
if(array[tmp]>array[j]){
tmp=j;
}
}
int temp=array[i];
array[i]=array[tmp];
array[tmp]=temp;
}
}
12345678910111213
时间复杂度:O(N^2);
空间复杂度:O(1);
不稳定
四、冒泡排序
思路:
通过比较j和j+1的值来进行交换,将最大的值锁定在最后一个,进行循环。
代码实现:
public static void bubbleSort01(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;
}
}
}
}
1234567891011
代码优化:
public static void bubbleSort02(int[] array) {
for(int i=0;i<array.length;i++){
boolean b=false;
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;
b=true;
}
}
if(b==false){
break;
}
}
}
12345678910111213141516
时间复杂度:O(N^2);
空间复杂度:O(1);