首页 > 编程语言 >排序算法(冒泡,快排,归并)

排序算法(冒泡,快排,归并)

时间:2024-12-19 19:27:53浏览次数:5  
标签:归并 nums int 元素 arr 快排 冒泡 排序 left

冒泡排序:(从小到大)

1.比较相邻元素,若第一个元素比第二个大,就交换两个

2.对相邻元素做同样步骤,从第一对元素到最后一对元素,直到最后的元素最大

3.对所有元素重复以上步骤,除了最后一个;

重复步骤1-3,直到排序完成

public static void sort(int w[])
{
    for(int i=0;i<w.length-1;i++)
    {
        for(int j=0;j<w.length-1-i;j++)
        {
            if(w[j]>w[j+1]){
            int t = w[j];
            w[j] = w[j+1];
            w[j+1]=t;
        }
    }
}

选择排序:(在剩余的元素中不断找到最大(小)值)

找到最大(小)的元素

再将它和数组的第一个元素交换位置

再从剩余的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置重复以上步骤,

public static void sort(int[] arr)
{
    int k=0;
    for(int i=0;i<arr.length;i++)
    {
        k=i;
        for(int j=i+1;j<arr.length;j++)
        {
            if(arr[k]>arr[j])k=j;
        }
        if(k!=i)
        {
            int tmp = arr[i];
            arr[i]  = arr[k];
            arr[k] = temp;
        }
    }
}

插入排序:(适用于部分有序的数组,也适合于小规模数组)

对未排序数据,在已排序序列中从后向前扫描,找到相应位置插入,插入位置之后的元素都要相应往后移动一位

   public  static void sort(int[] arr){
        for(int i=1;i<arr.length;i++){
            int key = arr[i];
            int j= i-1;
            while(j>=0 && arr[j]>key){
                arr[j+1] = arr[j];
                j--;
            }
            arr[j+1] = key;
        }
    }

快速排序:

选择一个基准数,比它大的数放在其右边,比它小的数放在其左边,在对这两边进行同样的操作(递归进行)既可以进行排序

public int[] Array(int[] nums){
    quicksort(nums,0,nums.length-1);
    return nums;
}

public void quicksort(int[] nums,int start,int end){
    int random =getRandom(nums,start,end);
    swap(nums,start,random);
    int left= start,right=end;
    while(left<right){
        
    }
}

希尔排序:

按照增量进行排序,之后缩小增量继续分组排序,直到增量减少到1时,整个文件被分为一组,再次排序完成整个数组的排序

    public  static int[] sort(int[] nums){
        for(int format =nums.length/2;format>0;format/=2){
            for(int i= format;i<nums.length;i++){
                int j =i;
                int tmp =nums[j];
                if(nums[j]<nums[j-format]){
                    while(j- format>=0 && tmp<nums[j-format]){
                        nums[j] =  nums[j-format];
                        j-=format;
                    }
                    nums[j]=tmp;
                }
            }
        }
        return nums;
    }

归并排序:

先拆分再合并

利用递归与分治技术将数组划分为最小的子表,对子表排序后用递归的方法进行合并

先分治再合并:

    public void merge(int[] nums,int left,int right){
        if(left==right)return;
        int mid = left+((right-left)>>1);
        merge(nums,left,mid);
        merge(nums,mid+1,right);
        sort(nums,left,mid,right);
    }

排序:

    public void sort(int[] nums,int left,int mid,int right){
        int[] arr = new int[right-left+1];
        int i=left,j=mid+1,k=0;
        while(i<=mid && j<=right){
            arr[k++] =  nums[i]<=nums[j]?nums[i++]:nums[j++];
        }
        while(i<=mid)arr[k++]=nums[i++];
        while(j<=right)arr[k++]=nums[j++];
        for(i=0;i<k;i++){
            nums[i+left] = arr[i];
        }
    }

计数排序:

1.找到最大最小值;

2.定义合适的数组,统计元素出现的频率;

3.输出结果

标签:归并,nums,int,元素,arr,快排,冒泡,排序,left
From: https://blog.csdn.net/weixin_47559057/article/details/144591877

相关文章

  • 数据结构与算法Python版 冒泡排序与选择排序
    文章目录一、冒泡排序二、选择排序一、冒泡排序冒泡排序BubbleSort对无序表进行多趟比较交换,每趟包括了多次两两相邻比较,并将逆序的数据项互换位置,最终能将本趟的最大项就位经过n-1趟比较交换,实现整表排序。每趟的过程类似于“气泡”在水中不断上浮到水面第1......
  • 【C语言】冒泡法从大到小排列,数组
    下面是一个使用冒泡排序法对10个整数进行由大到小排序的完整C语言示例程序。程序中定义了一个数组a来存放这10个整数,并使用嵌套循环实现冒泡排序的逻辑。voidbubbleSortDescending(intarr[],intn){for(inti=0;i<n-1;i++){for(intj=0;......
  • java 归并排序,原理、算法分析、实现细节、优缺点以及一些实际应用场景
    更多资源推荐:http://sj.ysok.net/jydoraemon提取码:JYAM实用优质资源/教程公众号【纪元A梦】###归并排序的详细解析探讨归并排序,包括其工作原理、算法分析、实现细节、优缺点以及一些实际应用场景。####1.基本概念归并排序是一种基于分治法的高效排序算法。它的基本思想是将......
  • 三种基本常见的排序算法(冒泡,选择,插入)
    一: 冒泡算法是一种简单的排序算法,以下是关于它的详细介绍: 基本原理: 重复遍历要排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就将它们交换过来,直到整个数列都有序为止。 算法步骤 1: 比较相邻的元素。如果第一个比第二个大,就交换它们两个。2.:对每一......
  • C语言中实现归并排序(Merge Sort)
    归并排序(MergeSort)是一种基于分治法(DivideandConquer)的高效排序算法,具有稳定性和O(nlogn)的时间复杂度,特别适用于处理大规模数据。基本原理归并排序通过以下步骤实现排序:分割(Divide):递归地将数组分成两半,直到每个子数组仅包含一个元素。合并(Conquer):将两个有序子数组合......
  • 数据结构6.4——归并排序
    基本思想:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为,称为二路归并。核心思想:将两个已经排好序的数组,合成......
  • 数组中的逆序对:基于归并排序的高效解法
    问题背景在算法和数据结构领域,"逆序对"是一个经典的计算问题。逆序对定义为数组中前面的元素大于后面的元素的数对。例如,在序列[7,5,6,4]中,存在的逆序对包括:(7,5)(7,6)(7,4)(5,4)(6,4)问题分析问题要求给定一个整数数组,要求计算数组中所有逆序对的总数。暴力解法的局......
  • 数据结构 (34)归并排序
    前言    归并排序(MergeSort)是一种高效、稳定的排序算法,它采用分治法的思想,将待排序的序列分为若干个子序列,然后对这些子序列进行排序,最后再将排好序的子序列合并成一个完整的有序序列。一、基本思想    归并排序的核心思想是分治法,即将大问题分解为小问题......
  • 在做题中学习(77):快排
    解法:快排思路:1.快排排一趟,递归分出来的左区间和右区间(一趟的思想,看我的前一个文章:颜色分类题解)2.递归:想清楚函数头和返回条件怎么写    函数头:把递归想成一个黑盒,默认它一定能完成任务,函数头就是nums,l,r意思是在nums数组中的[l,r]区间排好序。    ......
  • 编写一个冒泡算法,对10个整数进行排序
    #include<iostream>//冒泡排序函数voidbubbleSort(intarr[],intn){for(inti=0;i<n-1;++i){for(intj=0;j<n-1-i;++j){if(arr[j]>arr[j+1]){//交换相邻元素inttemp......