首页 > 其他分享 >排序

排序

时间:2024-07-31 17:52:00浏览次数:6  
标签:arr int len high ++ low 排序

排序

1.冒泡排序

void bubblesort1(int* arr, unsigned int len)
{
	//长度小于2就不用排序了
	if (len < 2) return;
	for (int i = 0; i < len - 1; i++) {
		for (int j = 0; j < len - 1 - i; j++) {
			if (arr[j] > arr[j + 1])
				swap(arr[j+1], arr[j]);
		}
	}

}
//冒泡排序使用递归的方法实现
void bubblesort2(int* arr, unsigned int len)
{
	if (len < 2) return;
	for (int i = 0; i < len - 1; i++) {
		if (arr[i] > arr[i + 1]) swap(arr[i], arr[i + 1]);
	}
	bubblesort2(arr, --len);
}

2. 选择排序

//使用非递归的方法,每一轮选出最小的值,与第一个元素进行交换
void selectsort1(int* arr, int len)
{
	int i = 0, j = 0, min = 0;
	for (i = 0; i < len - 1; i++) {
		min = i;
		for (int j = i + 1; j < len; j++) {
			if (arr[j] < arr[min]) min = j;
		}
		if (min != i) swap(arr[i], arr[min]);
	}
}
//使用非递归的方法,每一轮选出最小的和最大的值,最大的和最后一个元素交换,最小的和第一个元素交换
void selectsort2(int* arr, int len)
{
	int i = 0, j = 0, min = 0, max = 0;
	for (int i = 0; i < len / 2; i++) {
		min = i;
		max = len - 1 - i;
		for (int j = i + 1; j < len - i; j++) {
			if (arr[j] < arr[min]) min = j;
			if (arr[j] > arr[max]) max = j;
		}
		if(i!=min) swap(arr[min], arr[i]); 
		if(len-1-i!=max) swap(arr[max], arr[len - 1 - i]);
	}
}
//使用递归的方法实现选择排序算法
void selectsort3(int* arr, int len)
{
	if (len < 2) return; // 数组小于2个元素不需要排序。

	int ii;        // 排序的趟数的计数器。
	int iminpos = 0; // 每趟循环选出的最小值的位置(数组的下标)。

	for (ii = 1; ii < len; ii++)
	{
		// 找出值更小的元素,记下它的位置。
		if (arr[ii] < arr[iminpos])  iminpos = ii;
	}

	// 如果本趟循环的最小的元素不是起始位置的元素,则交换它们的位置。
	if (iminpos != 0) swap(arr[0], arr[iminpos]);

	selectsort2(arr + 1, --len);
}

3.插入排序

//直接插入排序,对于这个算法,我们可以进行优化,在插入排序的过程中,我们是逐级比对的,
//但是其实前面那个数据系列它是有序的,实际上我们可以通过二分查找法进行查找需要插入的位置,从而达到插入的效果
void insertsort1(int* arr, int len)
{
	int i, j;
	for ( i = 1; i < len; i++) {
		int temp = arr[i];
		for ( j = i - 1; j >= 0; j--) {
			if (arr[j] <= temp) break;
			arr[j + 1] = arr[j];
		}
		//+1是因为最后j还自减了一次
		arr[j + 1] = temp;
	}
}
//基于以上的想法,我们对直接插入排序做出改良,改良为二分插入排序
void insertsort2(int* arr, int len)
{
	int i, j, low, high, mid;
	int temp;
	for (i = 1; i < len; i++) {
		if (arr[i] < arr[i - 1]) {
			temp = arr[i];
			low = 0; high = i - 1;
			while (low <= high) {
				mid = (low + high) / 2;
				if (temp < arr[mid])  high = mid - 1;
				else low = mid + 1;
			}
			for (j = i - 1; j >= high + 1; j--)   arr[j + 1] = arr[j];
			arr[high + 1] = temp;
		}
	}
}
void Binary_InsertSort(int* arr, int length)
{
	int i, j, low, high, mid,temp;
	for (i = 1; i < length; i++) {
		if (arr[i] < arr[i - 1]) {
			temp = arr[i];
			low = 0, high = i - 1;
			while (low <= high) {
				mid = (low + high) / 2;
				if (arr[mid] > temp)   high = mid - 1;
				else low = mid + 1;
			}
			for (j = i - 1; j >= high + 1; j--) arr[j+1] = arr[j];
			arr[high + 1] = temp;
		}
	}
}

4. 快速排序

//我们要实现快速排序的算法,有递归和非递归两种方法
//我们现在从0开始自己实现了快速排序的算法了。
int partition(int* arr, int low, int high)
{
    int i = low;
    int pivot = arr[high];
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) swap(arr[j], arr[i++]);
    }
    swap(arr[i], arr[high]);
    return i;
}

void quicksort(int* arr, int low, int high)
{
    if (low < high) {
        int mid = partition(arr, low, high);
        quicksort(arr, low, mid - 1);
        quicksort(arr, mid + 1, high);
    }
}

5. 希尔排序

// 希尔排序
void shellsort(int *arr, int len)
{
    int i, j, inc, key;
    // 初始增量:len/2,每一趟之后除以二
    for (inc = len / 2; inc > 0; inc /= 2)
    {
        // 每一趟采用插入排序
        for (i = inc; i < len; i++)
        {
            key = arr[i];
            for (j = i; j >= inc && key < arr[j - inc]; j -= inc)
                arr[j] = arr[j - inc];
            arr[j] = key;
        }
    }
}

6.计数排序

//实现计数排序的代码
void countingsort(int arr[], int len)
{
    if (len < 1) return;

    // 寻找最大的元素
    int max = arr[0];
    for (size_t i = 1; i < len; i++)
        if (arr[i] > max) max = arr[i];

    // 分配一个长度为max+1的数组存储计数,并初始化为0
    int* count = (int*)malloc(sizeof(int) * (max + 1));
    if(count!=NULL)  memset(count, 0, sizeof(int) * (max + 1));

    // 计数
    for (size_t i = 0; i < len; i++)
        count[arr[i]]++;

    // 统计计数的累计值
    for (size_t i = 1; i < max + 1; i++)
        count[i] += count[i - 1];

    // 创建一个临时数组保存结果
    int* output = (int*)malloc(sizeof(int) * len);

    // 将元素放到正确的位置上
    for (size_t i = 0; i < len; i++)
    {
        output[count[arr[i]] - 1] = arr[i];
        count[arr[i]]--;
    }

    // 将结果复制回原数组
    for (size_t i = 0; i < len; i++)
        arr[i] = output[i];
}

标签:arr,int,len,high,++,low,排序
From: https://www.cnblogs.com/Tomorrowland/p/18335109

相关文章

  • 【初阶数据结构】11.排序(2)
    文章目录2.3交换排序2.3.1冒泡排序2.3.2快速排序2.3.2.1hoare版本2.3.2.2挖坑法2.3.2.3lomuto前后指针2.3.2.4非递归版本2.4归并排序2.5测试代码:排序性能对比2.6非比较排序2.6.1计数排序3.排序算法复杂度及稳定性分析2.3交换排序交换排序基本思想:......
  • 【算法 Java】排序
    排序所有的排序以从小到大排序为例模板题:牛客-简单的排序排序算法的稳定性体现在相同数值元素的相对位置会不会随排序改变,如果改变则不稳定,如果不改变则稳定冒泡排序比较相邻的元素。如果第一个比第二个大,就交换他们两个。越大的元素会经由交换慢慢"浮"到数列的末端。时间复......
  • 数据结构之八大排序(上)
    找往期文章包括但不限于本期文章中不懂的知识点:个人主页:我要学编程(ಥ_ಥ)-CSDN博客所属专栏:数据结构(Java版) 目录排序的相关介绍直接插入排序 希尔排序(缩小增量排序)选择排序堆排序冒泡排序 排序的相关介绍排序的概念:所谓排序,就是使一串记录,按照其中的某个或......
  • C语言——数组和排序
    C语言——数组和排序数组数组的概念数组的初始化数组的特点排序选择排序冒泡排序插入排序二分查找数组数组的概念数组是一组数据;数组是一组相同类型的数据或变量的集合;应用场景:用于批量的处理多个数据;语法:类型说明符数组名[常量表达式]类型说明符也就......
  • Luogu P1983 车站分级 题解 [ 绿 ] [ 拓扑排序 ] [ 图论建模 ] [ 虚点 ]
    车站分级:很好的拓扑排序题,细节有点多。图论建模首先观察对于一条线路,我们可以从中直接得到什么信息:假设这条线路的开头为\(st\),结尾为\(ed\),那么在\([st,ed]\)的车站中,没有被选入线路的点一定比选入线路的点的级数至少少\(1\)。对于这一点条件,我们就可以建模了。......
  • 【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
    前言:    接上篇,排序算法除了选择排序(希尔排序)和插入排序(堆排序)之外,还用交换排序(冒泡排序、快速排序)和归并排序已经非比较排序,本篇来深层解析这些排序算法一、交换排序    1.1、冒泡排序    冒泡排序,这个再熟悉不过了,学校中老师讲的第一个排序就......
  • 排序 floyd 拓扑排序
    //排序.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///**https://www.acwing.com/problem/content/345/给定n个变量和m个不等式。其中n小于等于26,变量分别用前n的大写英文字母表示。不等式之间具有传递性,即若A>B且B>C,则A>C。请从前往后遍......
  • 归并排序详解
    归并排序简介什么是排序算法排序算法是算法的基石,许多算法都基于排序算法,比如二分搜索、离散化等。这篇文章将要详细介绍将要介绍排序算法之一——归并排序。归并排序的性能归并排序的时间复杂度稳定在\(\mathcal{O}(n\log(n))\),是一种具有稳定性(即相同元素相对位置不变)的排......
  • RuntimeError:permute(sparse_coo):张量输入中的维度数与所需维度排序的长度不匹配
    因此,我使用这个剪辑模型来执行一些标记任务。但是当我使用剪辑模型的文本编码器时,它会出现以下错误:<ipython-input-117-4c513cc2d787>inforward(self,batch)34print(y.size())35print(y.dim())--->36y=self.text_encoder(y)37......
  • 排序 - 题解
    排序时间限制:C/C++1000MS,其他语言2000MS内存限制:C/C++64MB,其他语言128MB描述给定你一个长度为\(n\)的整数数列。请你使用任意排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。数据范围\(1≤n≤100000\)禁止使用sort函数输入描述输入共两......