插入排序
原理:从数组的第二个元素开始,将数组中的每一个元素按照(升序或者降序)规则插入到已排好序的数组中以达到排序的目的。
插入排序并不是将元素取出来,插入到合适位置,之后的元素的位置依次加一,而是元素两两比较,直到交换到合适位置,没有元素位置移动的过程,只有元素值交换。在宏观上像取出来插入一样,因此称为插入排序。
在上图中,数组7,6,9,3 …按升序排列,那么将7当作已升序排列好的一个元素的数组,从第二个元素比较,那么6<7应该”插入“到7之前,所以6,7交换元素,就相当于6插入到7之前。
第三个元素是9,大于7,无需移动,后一个元素是3,该元素需要与其位置之前的所有元素比较,而且是比较一次交换依次,而不是直接插入到6之前。过程是前与9比较小于然后交换值,然后在该位置在与前一个元素比较判断是否交换,也就是说每次比较符合条件,则向前移动一位,下一次比较再从当前位置与前一位比较,以此类推。
每次赋值是两两交换,一共需要循环n次,每个元素需要依次与其前或改变后前的元素比较。
//核心比较部分
for(i=0;i<len;i++){ //一共需要比较的总次数
for(j=i;j>0;j--){ //每个元素还需与其前的元素比较
if(a[j] < a[j-1]){
int tmp = a[j];
a[j]= a[j-1];
a[j-1] = tmp;
}
}
}
- c语言实现
#include<stdio.h>
int main(){
int i,j;
int a[]= {7,6,9,3,1,5,2,4};
int len = sizeof(a)/sizeof(int);
for(i=0;i<len;i++){
for(j=i;j>0;j--){
if(a[j] < a[j-1]){
int tmp = a[j];
a[j]= a[j-1];
a[j-1] = tmp;
}
}
}
for(i=0;i<len;i++){
printf("%d,",a[i]);
}
printf("\n");
}
- java实现
public class InsertSort {
public static void main(String args[]){
int a[]=new int[]{7,6,9,3,1,5,2,4};
insertSort(a);
for (int i =0;i<a.length;i++){
System.out.print(a[i]+"~");
}
}
/**
* @description 插入算法
* 核心:从第一位为元素开始当作已排序的数组,之后的元素依次与之前元素比较直到大于前者,小于后者(或者大于前者小于后者),满足则交换元素的值。
* 比较是两脸个比较的,因此循环比较完的元素是排序好的,在宏观上相当于将元素取出来插入到合适的位置
*/
public static void insertSort(int a[]){
for (int i =1;i<a.length;i++){ //对于每一个元素都需要取出判断
for (int j=i;j>0;j--){ //每个元素需要依次与其前的元素比较直到插入到合适位置
if(a[j] <a[j-1] ){
int tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
}
}
}
}
}
插入排序对n个元素的数组来说,外层循环n次,内层约n-1次,因此时间复杂度为:
O ( n ) = n 2 O(n) = n^2 O(n)=n2
选择排序
原理:选择排序是每次选择最小的放在未排序数组的开始位置。
在如图所示的数组中选择最小的1放在数组初位置,则该位置作为已排序的数组,再从剩下的数组中选择最小的继续放在初位置,以此类推。
对于数组来说需要对n个元素查找最小的,每次查找最小的的需要n-i次。
- c语言实现
#include<stdio.h>
int main(){
int i,j;
int a[]= {7,4,5,9,8,2,1};
int len = sizeof(a)/sizeof(int);
for(i=0;i<len;i++){ //依次取出n个元素
for(j=i;j<len;j++){ //对每个元素于剩余元素作比较取最小值
if(a[i] > a[j]){
int tmp = a[i];
a[i]= a[j];
a[j]= tmp;
}
}
}
for(i=0;i<len;i++){
printf("%d",a[i]) ;
}
}
- java实现
package 选择排序;
public class QuickSort {
public static void main(String[] args) {
int a[] = new int[]{7,4,5,9,8,2,1};
for (int i =0;i< a.length;i++){
for(int j =i+1;j<a.length;j++){
if(a[i]<a[j]){
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
for (int i=0;i<a.length;i++){
System.out.print(a[i]+",");
}
}
}