首页 > 其他分享 >排序

排序

时间:2024-07-15 19:19:20浏览次数:13  
标签:tmp arr int void gap 排序

排序

稳定排序:相等的数字位置不变

非稳定排序:相等的数位置变换

内排序:一次性装进内存

外排序:先装到外存,再分步装到内存

插入排序

void insertSort(int *arr, int len) 
{
	int i, j, tmp;   
	if(len == 1)    
    	return;   
    for(i=1; i<len; i++) //从arr[1] 到arr[len - 1]   
    {
        tmp = arr[i];     //从arr[i-1](arr[j])向前面查找插入位置     
        	for(j = i-1;  j >=0; j--)     
        	{       
        		if(arr[j] < tmp)          
        		break;       
        		else       
        		{         
        			arr[j+1]=arr[j];       
        		} 
              }    
              arr[j+1] = tmp; 
     }      
}

希尔排序

相隔一定间隔局部有序,再整体排序

1.分组
2.插入排序
3.逐步减少增量

image-20240715154838124

void shellSort(int arr[], int n) 
{
    //缩小增量,以长度8为例,增量变化:4  2  1
    for (int gap = n / 2; gap > 0; gap /= 2) 
    {
        //组内排序 元素arr[gap]到arr[n-1]
        for (int i = gap; i < n; i++)//
        {
                int temp = arr[i];
                int j;                 //arr[0]>arr[4]
                for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
                {
                        arr[j] = arr[j - gap];
                }
                arr[j] = temp;
        }
    }
}

冒泡排序

void maopaoSort(int arr[], int n) 
{
    int i, j;
    //需要排序的数组次数
    for(i=0; i< (n-1); i++)
    {
        //数组内排序 5-1 = 4
        for(j=0; j < (n-i-1) ; j++)
        {
            if(arr[j] > arr[j+1])
            {
                //数据交换
                int tmp  = arr[j+1];
                arr[j+1] = arr[j];
                arr[j]   = tmp;
            }
        }
    }
}

选择排序

​ 选择排序就是依次从头到尾挑选合适的元素放到前面。如果总共有n个节点,那么选择一个合适的节点需要比较n次,而总共要选择n次,因此总的时间复杂度是O(n2)

void swap(int *a, int *b)
{

    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
void select(int *p,int len)
{
    int i, j, min;

    for(i=0; i<len; i++)
    {
        min = i;  //最小值下标
        for(j = i+1; j<len; j++)
        {
            if(p[j] < p[min]) //如果最p[j] 小于 p[min],要更换最小下标
            {
                min = j;
            }

        }
       swap(&p[i], &p[min]); 
    }
    return;
} 

快速排序

快排是一种递归思想的排序算法,先比较其他的排序算法,它需要更多内存空间,但快排的语句频度是最低的,理论上时间效率是最高的。

快速排序的基本思路是:在待排序序列中随便选取一个数据,作为所谓“支点”,然后所有其他的数据与之比较,以从小到大排序为例,那么比支点小的统统放在其左边,比支点大的统统放在其右边,全部比完之后,支点将位与两个序列的中间,这叫做一次划分(partition)。

一次划分之后,序列内部也许是无序的,但是序列与支点三者之间,形成了一种基本的有序状态,接下去使用相同的思路,递归地对左右两边的子序列进行排序,直到子序列的长度小于等于1为止。

void display(int *arr, int len)
{
    int i;
    for(i=0; i<len; i++)
    {
        printf("%d\t", arr[i]);
    }
    printf("\n");
}
void swap(int *a, int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
//找支点
int partion(int *arr, int len)
{
    int i, j;
    if(len <= 1)
        return 0;
    i = 0; 
    j = len-1;
    while(i < j)
    {
        while(arr[i] < arr[j] && i<j)
        {
            j--;
        }
        swap(&arr[i], &arr[j]);
        while(arr[i] <= arr[j] && i<j)
        {
            i++;
        }
        swap(&arr[i], &arr[j]);
    }
  
    //返回支点
    return i;
}
//快速排序
void quickSort(int arr[],int len)
{
    if(len <= 1)
        return;
    
    //找支点
    int pivort=partion(arr, len);
    //左边
    quickSort(arr, pivort); 
    //右边
    quickSort(arr+pivort+1, len-pivort-1); 
} 

标签:tmp,arr,int,void,gap,排序
From: https://www.cnblogs.com/8866880c/p/18303810

相关文章

  • 快速排序模板及其理解
    快速排序在面试中经常用于考察面试者的代码能力,以下是我个人对如何手撕快排的一些理解:原理:快速排序的解决分为两个部分,分区(partition)和递归(recurse)。分区是主要进行排序的功能,递归用于控制分区的次数。分区的思想是:选定一个数,将所有小于这个数的数组元素都放在它的左侧,同理......
  • 解决equal to 运算中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CS_AS" 之间的排序规则冲
    背景:在语句执行过程中碰到equalto运算中"Chinese_PRC_CI_AS"和"Chinese_PRC_CS_AS"之间的排序规则冲突的报错时,可以用COLLATE定义和控制字符数据排序规则。在SQLServer中,COLLATE是用于定义和控制字符数据排序规则(collation)的关键字。排序规则影响字符串比较和排序的行......
  • React中使用dnd-kit实现拖曳排序功能
    在React中使用`dnd-kit`库实现拖拽排序功能,你需要遵循以下步骤:1.**安装dnd-kit**:首先,确保你已经安装了`dnd-kit`库。如果还没有安装,可以通过npm或yarn来安装:  ```bash  npminstall@dnd-kit/core  ```2.**引入必要的组件和钩子**:从`dnd-kit`中引入`Draggable`、`DragO......
  • 面试算法(排序)附带c++/python实现
            排序算法是面试中会经常会被问到的一类问题,如果可以掌握较多的排序算法,在面试过程中才更有机会被面试官看重哦,下面我们准备了一些常见的面试算法,并分别给出了c++和python的代码实现,小伙伴们一起学起来吧!冒泡排序(BubbleSort)        基于交换的排序,......
  • 【C语言】全面解析冒泡排序
    文章目录什么是冒泡排序?冒泡排序的基本实现代码解释冒泡排序的优化冒泡排序的性能分析冒泡排序的实际应用结论在C语言编程中,排序算法是一个非常基础且重要的概念。冒泡排序作为最简单、最易理解的排序算法之一,广泛应用于各种编程教学和实践中。本文将全面解析C语......
  • 从零开始备战蓝桥杯——一天一个小算法第一天(排序篇)
    今天使我们学习算法的第一天,算法内容为冒泡排序和选择排序。冒泡排序思想:两两相邻数字排序,小的放在前面大的放在后面。从左往右遍历,不断重复第一步,这样可以永远保证大的在最后面重复上述操作,可以得到一个数组从小到大的排序。事例:假设我们有n个数字。第一次比较遍历全......
  • Java实现堆排序算法详解及优化
    引言堆排序(HeapSort)是一种基于堆数据结构的比较排序算法。它具有良好的时间复杂度特性,在许多实际应用中表现出色。本文将详细讲解如何使用Java实现堆排序算法,并结合图解和实例代码,帮助您全面理解这一高级排序算法。同时,我们还将探讨堆排序的优化方法,以进一步提高其性能。......
  • 排序-java(详解)
    一,分类主要的排序大致分为以下几类:1,插入排序,又分为直接插入排序和希尔排序2,选择排序,又分为选择排序和堆排序3,交换排序,又分为冒泡排序和快速排序4,归并排序 二,插入排序1,直接插入排序一个数组,定义两个变量i和j,i从数组的第二个元素开始往后遍历,直到数组结束。每次遍历把......
  • 拓扑排序——AcWing 164. 可达性统计
    目录拓扑排序定义运用情况注意事项解题思路AcWing164.可达性统计题目描述运行代码代码思路改进思路拓扑排序定义拓扑排序(TopologicalSort)是对有向无环图(DirectedAcyclicGraph,简称DAG)的一种排序方式。在一个有向无环图中,拓扑排序的结果是一个线性的顶点序列,其......
  • Floyd算法——AcWing 343. 排序
    目录Floyd算法定义运用情况注意事项解题思路基本步骤AcWing343.排序 题目描述运行代码代码思路改进思路Floyd算法定义Floyd算法,全称Floyd-Warshall算法,是一种用于解决图中所有顶点对之间的最短路径问题的动态规划算法。它适用于带权有向图,且可以处理负权重边(......