排序-插入排序、冒泡排序、选择排序、快速排序 (待补齐)

1、插入排序(Insertion Sort)

插入排序是一种简单直观的排序算法,其核心思想是将未排序的元素逐个插入已排序部分的合适位置,直到整个数组排序完成。

算法步骤

  1. 初始已排序部分:将第一个元素视为已排序部分。
  2. 逐个插入:遍历未排序部分的每个元素,在已排序部分中找到合适的位置并插入。
  3. 重复直到完成:重复以上步骤,直到所有元素都插入到已排序部分。

  动画演示:

来个图示:

 

#include<stdio.h>
#include<stdbool.h>





bool insert_sort(int a[],int size){
    int value = 0;
    int temp = 0;

    for( int i = 1 ; i < size ; ++i ){
            value=a[i];

        for(int j= i ;j >= 0 ; --j){

            if( j == 0 ){
                    a[j] = value; 
                    break; 
                }
            if( value < a[j-1] ){
                a[j] = a[j-1];
            }else{
                 a[j] = value;
                 break;
            }
        }
        
    }
    return true;
}

// 插入排序函数  用while 来思考更简单
void insertion_sort(int arr[], int n) {
    int i, j, key;
    
    // 从第二个元素开始,将其插入到已排序部分的合适位置
    for (i = 1; i < n; i++) {
        key = arr[i]; // 当前要插入的元素
        j = i - 1;
        
        // 将大于key的元素向后移动
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        
        // 插入key
        arr[j + 1] = key;
    }

void main(){

    int a[] ={55,3,4000,2,100};
    int size = 5;
     for(int i=0;i<size;i++){
        printf("%d    ",a[i]);
    }
    printf("\n");
    insertsort(a,size);
    for(int i=0;i<size;i++){
        printf("%d    ",a[i]);
    }
    printf("\n");
    
}

 

2、冒泡排序(Bubble Sort)

算法步骤

  • 重复走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
  • 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成

  动画演示:

核心思想​ 通过相邻元素交换,将最大值“冒泡”到数组末尾。
​步骤分解​ 1. 遍历数组,比较相邻元素
2. 若左>右则交换
3. 每轮缩小遍历范围(末尾已排序)
​示例步骤​ 初始数组:[5, 3, 8, 4, 2]
第一轮:5↔3 → [3,5,8,4,2]; 8保持; 8↔4 → [3,5,4,8,2]; 8↔2 → [3,5,4,2,8]
第二轮:5↔4 → [3,4,5,2,8]; 5↔2 → [3,4,2,5,8]
第三轮:4↔2 → [3,2,4,5,8]
第四轮:3↔2 → [2,3,4,5,8]
​时间复杂度​ 最好 O(n),平均 O(n²),最坏 O(n²)
​稳定性​ 稳定

 

3、选择排序(Selection Sort)

算法步骤

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  • 重复第二步,直到所有元素均排序完毕。

  动画演示:

​核心思想​ 每次从未排序部分选择最小值,与未排序部分的首元素交换。
​步骤分解​ 1. 遍历数组,找到最小值索引
2. 交换最小值与当前未排序部分的起始位置
​示例步骤​ 初始数组:[5, 3, 8, 4, 2]
第一轮:最小2 ↔ 5 → [2,3,8,4,5]
第二轮:最小3保持 → [2,3,8,4,5]
第三轮:最小4 ↔ 8 → [2,3,4,8,5]
第四轮:最小5 ↔ 8 → [2,3,4,5,8]
​时间复杂度​ 始终 O(n²)
​稳定性​ 不稳定(交换可能破坏相等元素的顺序)

4、快速排序(Quick Sort)

 

算法步骤

  1. 从待排序的数组中选择一个元素,称之为枢纽元(pivot)。
  2. 将数组中小于枢纽元的元素移到枢纽元的左边,将大于枢纽元的元素移到枢纽元的右边,这个过程称为分区(partition)。
  3. 递归地对枢纽元左边的子数组和右边的子数组进行排序。
  4. 当所有子数组都有序时,整个数组就自然有序了。

  动画演示:

​核心思想​ 分治法:选取基准元素,将数组分为小于基准和大于基准的两部分,递归排序。
​步骤分解​ 1. 选择基准(如第一个元素)
2. 分区:左小右大
3. 递归处理左右子数组
​示例步骤​ 初始数组:[5, 3, 8, 4, 2]
基准=5,分区后:[3,4,2,5,8]
递归左子数组[3,4,2]:基准=3 → [2,3,4]
递归右子数组[8]:直接返回 → [5,3,4,2,8] → 最终[2,3,4,5,8]
​时间复杂度​ 平均 O(n log n),最坏 O(n²)(已有序)
​稳定性​ 不稳定

 

 

posted @ 2025-05-20 10:43  记得要好好吃饭  阅读(144)  评论(0)    收藏  举报