五种排序算法,冒泡排序 选择排序 插入排序 希尔排序 快速排序

目录

前言

1.冒泡排序(Bubble Sort)

        概念

        代码实现

        注意

2.选择排序(Selection Sort)

        概念

        代码实现

        注意事项

3.插入排序(Insertion Sort)

        概念

         代码实现

        注意

4.希尔排序(Shell Sort)

        概念

        代码实现

        注意

5.快速排序(Quick Sort)

        概念

         代码实现

        注意


前言

        我们的生活中时常会遇到大量的数据,他们或许有序或许杂乱无章,那么如何让一些杂乱无章的数据变得有序呢?本篇文章会让了解几种基础的排序算法。


1.冒泡排序(Bubble Sort)

        概念

        ”冒泡排序“ 顾名思义,他像小鱼吐泡泡一样,每次吐出一个泡泡,后面的泡泡跟在前面的泡泡的后面,变成一连串的泡泡。五种排序算法,冒泡排序 选择排序 插入排序 希尔排序 快速排序_第1张图片

图解 五种排序算法,冒泡排序 选择排序 插入排序 希尔排序 快速排序_第2张图片

那么代码如何实现呢?

        代码实现

void Bubble_Sort(int a[]){

    //外层循环用来控制排序的次数
	for(int i=0 ; i<10-1 ; i++){

        //内层循环控制比较的内容
		for(int j=0 ; j<10-i-1 ; j++){

            //比较当前位置和后一个位置的数据的大小
			if(a[j] < a[j+1]){

                //交换两个位置的数据
				int t = a[j];
				a[j] = a[j+1];
			    a[j+1] = t;

			}//if
		}//for j
	}//for i
    
    //输出排序后的数据
	for(int i=0 ; i<10 ; i++){
		printf("%d  ",a[i]);
	}
}
//主函数
int main(){

    //数组的定义
	int a[10];
    
    //循环对数组录入数据
	for(int i=0;i<10;i++){
		scanf("%d",&a[i]);
	}
    
    //调用冒泡排序函数
    Bubble_Sort(a);
return 0;
}

        注意

  • 冒泡排序是一个稳定的排序方法
  •  每次循环都会找出最小或者最大的数字放到最后一个位置

2.选择排序(Selection Sort)

        概念

        “选择排序” 每次选择一个最大或者最小的数据,把他放在一个合适的位置。

图解五种排序算法,冒泡排序 选择排序 插入排序 希尔排序 快速排序_第3张图片

        代码实现

void Selection_Sort(int a[]){
	
	//外循环控制已排序的最后一个数据
	for(int i=0 ; i<10 ; i++){
        
        //记录其下标
		int min=i;

        //内循环控制未排序部分
		for(int j=i+1 ; j<10 ; j++){
            
            //未排序的数据和已排序的最后一个元素比较
			if(a[j] < a[min]){
                
				min = j;    //比已排序数据更小记录其下标

			}//if
		}//for j
        
        //min 如果被改变,那就代表有更小的数据
		if(min != i){
            
            //交换两个位置的数据
			int t = arr[i];
			arr[i] = arr[min];
			arr[min] = t;

		}//if
	}//for i

	//输出排序后数据
	for(int i=0 ; i<10 ; i++){
		printf("%d  ",a[i]);
	}
}
//主函数
int main(){
    
    //定义数组
    int a[10];
    
    //数组录入数据
	for(int i=0 ; i<10 ; i++){
		printf("请输入第%d个元素",i+1);
		scanf("%d",&a[i]);
	}

    //调用选择排序函数
	Selection_Sort(a);

	return 0;
}

        注意事项

  • 选择排序是一个不稳定的排序方法
  • 选择排序每次执行会找到最小或最大的数据,放在数组的前面

3.插入排序(Insertion Sort)

        概念

        “插入排序” 顾名思义数据插入到合适的位置,就像买菜一样,会挑出卖相好的菜,卖相不好的不会优先考虑去购买。

       图解        五种排序算法,冒泡排序 选择排序 插入排序 希尔排序 快速排序_第4张图片

         代码实现

void Insertion_Sort(int a[]) {

    //假设下标 0 位置是已经排好的数据,i下标从1开始循环后续数据
	for(int i=1 ; i<10 ; i++) {
		
        //拷贝一份 i 位置的数据
        int temp=a[i];
        
        //j下标是已排好数据的下标,从 i 的前一个开始
		int j=i-1;
		for( ; j>=0 && a[j]>temp ; j--) {    //每次 j 下标 -1 向前走,去和排好数据依次比较
			
            //前面的数据后移给 temp 数据的进入腾位置
            a[j+1]=a[j];

		}//for j

        //出 j 循环时 j 会多 -- 一次,+1 才是最后需要插入的位置
		a[j+1]=temp;

	}//for i
}
//主函数
int main(){

    //定义数组
    int a[10];
    
    //数组录入数据
	for(int i=0 ; i<10 ; i++){
		printf("请输入第%d个元素",i+1);
		scanf("%d",&a[i]);
	}

    //调用插入排序函数
    Insertion_Sort(a);

    return 0;
}

        注意

  • 插入排序是一个稳定的排序方法
  • 待排序数据会和他之前的数据一个一个比较,当找到合适位置时,插入到其中
  • 插入排序更适合对一个基本有序的数据进行排序

4.希尔排序(Shell Sort)

        概念

        “希尔排序” 是把数据分成一个一个小区域,对小区域内的数据进行排序,再缩小区域进行新的排序,是插入排序衍生出的一种排序方法,整体思想和插入排序一样。

       图解五种排序算法,冒泡排序 选择排序 插入排序 希尔排序 快速排序_第5张图片

五种排序算法,冒泡排序 选择排序 插入排序 希尔排序 快速排序_第6张图片 

        代码实现

void Shell_Sort(int a[]) {

    //排序 3 次,每次把数据分为 5/3/1 个数据一组
	int t[3]= {5,3,1};

    //控制每次元素的个数
	for(int i=0 ; i<3 ; i++) {

        //拷贝第二组第一个数据
		int dk=t[i];

        //j 从第二组开始循环,每次往后移动                                                                                                                                                       
		for(int j=dk ; j<10 ; j++) {

            //比较前一组对应的位置
			if(a[j] < a[j-dk]) {
                
                //拷贝第二组的值
				int temp = a[j];

                //k循环第一组,每次往前比较
				int k = j-dk;
				for( ; k>=0 && a[k]

         注意

  • 希尔排序是一种不稳定的排序方法
  • 由于是插入排序衍生出的一种排序方法,所以大体思想和插入排序一样

5.快速排序(Quick Sort)

        概念

        “快速排序” 需要用到递归思想,类似于小朋友排队,找一个标准,高于标准的排到后面,低于标准的排到前面,
每次缩小范围,直到有序为止。

图解五种排序算法,冒泡排序 选择排序 插入排序 希尔排序 快速排序_第7张图片

         代码实现

//分区
int fenqu(int a[10],int tou,int wei) {
	
	//基准值赋值 
	int jz = a[tou];
	
	//头下标小于尾下标才能执行分区 
	while(toujz) {
			wei--;	//尾下标前移 
		}
		a[tou] = a[wei];	//比基准值小就移动到前面
		
		//在基准值前面比基准值小的不做交换 
		while(tou

        注意

  • 快速排序是一种不稳定的排序方法
  • 快速排序要注意递归部分的范围,以及要先进行基准值之后的数据进行比较排序,否则无法运行

2023年3月22日

你可能感兴趣的:(算法,排序算法)