插入排序,选择算法与快速排序(c语言,Java语言)

插入排序

原理:从数组的第二个元素开始,将数组中的每一个元素按照(升序或者降序)规则插入到已排好序的数组中以达到排序的目的。

插入排序并不是将元素取出来,插入到合适位置,之后的元素的位置依次加一,而是元素两两比较,直到交换到合适位置,没有元素位置移动的过程,只有元素值交换。在宏观上像取出来插入一样,因此称为插入排序。

在这里插入图片描述

在上图中,数组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;
			}
		}
	}
  1. 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");
} 
  1. 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次。

  1. 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]) ;
	}
}
  1. 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]+",");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xvwen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值