【数据结构与算法】十大经典排序(c语言&Java)(1)

简介: 【数据结构与算法】十大经典排序(c语言&Java)(1)

🍓 冒泡排序(Bubble Sort)


image.png

简介:


冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。


它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。


这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。


设计思想:


依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。


第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。


比较第2和第3个数,将小数 放在前面,大数放在后面。



如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成


在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。


在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。


依次类推,每一趟比较次数减少依次


代码实现:


c语言版

//冒泡排序
void BubbleSort(int *arr, int size)  
{  
  //给定临时变量
    int i, j, tmp;  
    //嵌套循环
    for (i = 0; i < size - 1; i++) {  
        for (j = 0; j < size - i - 1; j++) {  
          //满足条件就调换位置
            if (arr[j] > arr[j+1]) {  
              //核心代码,交换位置
                tmp = arr[j];  
                arr[j] = arr[j+1];  
                arr[j+1] = tmp;  
            }  
        }  
    }  
}


Java版

  /**
   * 冒泡排序
   * @param array
   * @return
   * @date 2022/01/20
   */
  public static int[] bubbleSort(int[] array){
    if(array.length > 0){
      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;
          }
        }
      }
    }
    return array;
  }


🍋 选择排序(Selection Sort)


image.png

简介:


选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。


设计思想:


在一个长度为 N 的无序数组中,第一次遍历 n-1 个数找到最小的和第一个数交换。

第二次从下一个数开始遍历 n-2 个数,找到最小的数和第二个数交换。

重复以上操作直到第 n-1 次遍历最小的数和第 n-1 个数交换,排序完成。

代码实现:


c语言版

void SelectionSort(int *arr, int size)
{
    int i, j, k, tmp;
    for (i = 0; i < size - 1; i++) {
        k = i;
        for (j = i + 1; j < size; j++) {
            if (arr[j] < arr[k]) {
                k = j;
            }
        }
        tmp = arr[k];
        arr[k] = arr[i];
        arr[i] = tmp;
    }
}


Java版

/**
 * @param arr
 * @date 2022/01/20
 * /
public static void selectionSort(int[] arr){                
    for(int i = 0; i < arr.length - 1; i++){
        // 交换次数         
        // 先假设每次循环时,最小数的索引为i            
        int minIndex = i;// 每一个元素都和剩下的未排序的元素比较          
        for(int j = i + 1; j < arr.length; j++){             
            if(arr[j] < arr[minIndex]){//寻找最小数                   
                minIndex = j;//将最小数的索引保存                
            }           
        }//经过一轮循环,就可以找出第一个最小值的索引,然后把最小值放到i的位置           
        swap(arr, i, minIndex);         
    }   
}
private static void swap(int[] arr, int i, int j) {     
    int temp = arr[i];      
    arr[i] = arr[j];        
    arr[j] = temp;          
}


🌽 插入排序(Insertion Sort)


image.png

简介:


插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。


设计思想:


一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:


从第一个元素开始,该元素可以认为已经被排序;

取出下一个元素,在已经排序的元素序列中从后向前扫描;

如果该元素(已排序)大于新元素,将该元素移到下一位置;

重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后;

重复步骤2~5。

代码实现:


c语言版


void InsertionSort(int *arr, int size)    
{    
    int i, j, tmp;    
    for (i = 1; i < size; i++) {    
        if (arr[i] < arr[i-1]) {    
            tmp = arr[i];    
            for (j = i - 1; j >= 0 && arr[j] > tmp; j--) {  
                arr[j+1] = arr[j];    
            }  
            arr[j+1] = tmp;    
        }          
    }    
}    


Java版

  /**
   * 插入排序
   * @param array
   * @return
   * @date 2022/01/20
   */
  public static int[] insertSort(int[] array){
    if(array.length > 0){     
      for(int i = 0 ;i<array.length - 1;i++){
        int current = array[i+1];
        int index = i;
        while(index >= 0 && current < array[index]){
          array[index + 1] = array[index]; 
          index--;
        }
        array[index+1] = current;
      }
    }
    return array;
  }
相关文章
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
192 5
|
3月前
|
机器学习/深度学习 运维 算法
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
246 0
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
|
4月前
|
机器学习/深度学习 算法 安全
【无人机3D路径规划】基于非支配排序遗传算法NSGAII的无人机3D路径规划研究(Matlab代码实现)
【无人机3D路径规划】基于非支配排序遗传算法NSGAII的无人机3D路径规划研究(Matlab代码实现)
215 1
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
152 0
|
3月前
|
机器学习/深度学习 算法 安全
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)
107 0
|
4月前
|
机器学习/深度学习 算法 安全
【优化调度】基于matlab非支配排序遗传算法求解车辆充电调度优化问题研究(Matlab代码实现)
【优化调度】基于matlab非支配排序遗传算法求解车辆充电调度优化问题研究(Matlab代码实现)
116 0
|
3月前
|
存储 算法 搜索推荐
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
专攻软考高频算法,深度解析二分查找、堆排序、快速排序核心技巧,对比九大排序算法,配套动画与真题,7天掌握45%分值模块。
162 1
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
3月前
|
供应链 算法 Java
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
122 1
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划研究(Matlab代码实现)