首页 > 其他分享 >排序

排序

时间:2024-04-18 21:22:26浏览次数:23  
标签:end nums int mid start 排序 size

排序算法

  • 直接插入
  • 折半插入
  • 冒泡排序
  • 简单选择排序
  • 快速排序
  • 堆排序

实现以及使用c++

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;

void half_insert_sort(int nums[], int size) {
	// 将新数字插入到有序数组中
	// 使用折半查找寻找插入的位置
	for (int i = 0; i < size - 1; i++) {
		// [0,i]是有序数组
		// i+1是新添加的数字
		int start = 0, end = i;
		int mid;
		int temp = nums[i + 1];
		while (start < end) {
			mid = start+(end-start) / 2;
			if (nums[mid] < temp) {
				start = mid + 1;
			}
			else if (nums[mid] > temp) {
				end = mid - 1;
			}
			else {
				start = mid;
				break;
			}
		}
		for (int j = i; j > start; j--) {
			nums[j + 1]=nums[j];
		}
		if (nums[start] <= temp) {
			nums[start + 1] = temp;
		}
		else {
			nums[start + 1] = nums[start];
			nums[start] = temp;
		}
	}
}

void bubble_sort(int nums[], int size) {
	// 交换排序的一种 将最大的冒出来
	for (int i = 0; i < size; i++) {
		bool flag = false;
		for (int j = 0; j < size - i-1; j++) {
			if (nums[j] > nums[j + 1]) {
				int temp = nums[j + 1];
				nums[j + 1] = nums[j];
				nums[j] = temp;
				flag = true;
			}
		}
		if (!flag) {
			break;
		}
	}
}

int fast_sort_part(int nums[], int start, int end) {
	
	while (start < end) {
		while (start < end && nums[start] <= nums[end]) {
			start++;
		}
		if (start < end) {
			//交换
			int temp = nums[start];
			nums[start] = nums[end];
			nums[end] = temp;
		}

		while (start < end && nums[start] <= nums[end]) {
			end--;
		}
		if (start < end) {
			// 交换
			int temp = nums[start];
			nums[start] = nums[end];
			nums[end] = temp;
		}

	}
	return start;
}

void Q_sort(int nums[], int start, int end) {
	if (start < end) {
		int fenge = fast_sort_part(nums, start, end);
		// 排序 [0,fenge) (fenge,end]
		Q_sort(nums, 0, fenge-1);
		Q_sort(nums, fenge+1, end);
	}
}

// 快速排序
void fast_sort(int nums[],int size) {
	// 将小于val移到val之前 大于val的移动到val之后
	Q_sort(nums, 0, size - 1);

}

// 简单选择排序
void choose_sort(int nums[], int size) {
	for (int i = 0; i < size; i++) {
		// 做i趟 每趟选择最大的
		int i_max = size-i-1;
		for (int j = 0; j < size-i-1; j++) {
			if (nums[i_max] < nums[j]) {
				i_max = j;
			}
		}
		int temp = nums[size - i - 1];
		nums[size - i - 1] = nums[i_max];
		nums[i_max] = temp;
	}
}

void adjust_heap(int nums[], int last_index) {
	int front = nums[0];
	int i = 0;
	while (2 * i + 1 <= last_index) {// 当不是叶子的时候
		if (2 * i + 2 > last_index) {//没有右孩子
			if (front < nums[2 * i + 1]) {
				// 交换
				nums[i] = nums[2 * i + 1];
				i = 2 * i + 1;
			}
			else {
				break;
			}
		}
		else {
			if (front < nums[2 * i + 1] || front < nums[2 * i + 2]) {
				if (nums[2 * i + 1] < nums[2 * i + 2]) {
					nums[i] = nums[2 * i + 2];
					i = 2 * i + 2;
				}
				else {
					nums[i] = nums[2 * i + 1];
					i = 2 * i + 1;
				}
			}
			else {
				break;
			}
		}
	}
	nums[i] = front;

}

// 堆排序
// 什么是堆 父节点大于左右孩子节点是大根堆 小于是小根堆 建立堆 然后把最后堆顶移到最后 最后的移上去 调整堆
void heap_sort(int nums[], int size) {
	// 建堆
	// 叶子节点个数是
	int leaf_size = (size + 1) / 2;
	// 非叶子节点开始的下标为
	int index = size - leaf_size-1;
	// 初始建堆
	for (int i = index; i >= 0; i--) {
		if (2 * i + 2 >= size) {//没有右孩子
			if (nums[i] < nums[2 * i+1]) {
				// 交换
				int temp = nums[i];
				nums[i] = nums[2 * i+1];
				nums[2 * i+1] = temp;
			}
		}
		else {
			if (nums[i] < nums[2 * i+1]||nums[i]<nums[2*i+2]) {
				if (nums[2 * i+1] < nums[2 * i + 2]) {
					int temp = nums[i];
					nums[i] = nums[2 * i + 2];
					nums[2 * i + 2] = temp;
				}
				else {
					int temp = nums[i];
					nums[i] = nums[2 * i+1];
					nums[2 * i+1] = temp;
				}
			}
		}
	}
	// 
	for (int i = 0; i < size; ) {
		// 取下堆顶
		int max = nums[0];
		// 将堆尾放到堆顶
		nums[0] = nums[size - 1 - i];
		nums[size - 1 - i] = max;
		i++;
		// 调整堆[0,size-1-i]
		adjust_heap(nums, size - 1 - i);
	}
}
// 使用algorithm中的sort
bool cmp(int x,int y) {
	return x < y;// y在前 从大到小
}

// 优先队列构造堆
struct cmp_priority
{
	bool operator()(int x, int y) {
		return x < y;// y在前 大根堆
	}
};
void test(int nums[],int size) {
	priority_queue<int, vector<int>, cmp_priority> q;
	for (int i = 0; i < size; i++) {
		q.push(nums[i]);
	}
	for (int i = 0; i < size; i++) {
		cout << q.top() << " ";
		q.pop();
	}
}



int main() {
	int nums[] = { 3,4,2,2,1,6,3 };
	int size = 7;
	//half_insert_sort(nums, size);
	//bubble_sort(nums, size);
	//fast_sort(nums, size);
	//choose_sort(nums, size);
	//heap_sort(nums, size);
	//sort(nums, nums + size, cmp);


	/*for (int i = 0; i < size; i++) {
		cout << nums[i] << " ";
	}*/

	test(nums, size);
}
```cpp

标签:end,nums,int,mid,start,排序,size
From: https://www.cnblogs.com/code-fun/p/18144435

相关文章

  • 06-排序 分页 过滤
    排序查询多条和全部才会用到排序排序关键字:ordering查询字符串查询字符串(QueryString)是指在URL中以问号(?)开始的部分,用于向服务器传递参数。它由一个或多个键值对组成,每个键值对之间用&符号分隔。例如,在以下URL中,查询字符串是?page=2&category=books:在django种如......
  • C++排序问题
    冒泡排序若得到一个从小到大的数组例如:3527481角标:1234567就是角标1和角标2比,若1大于2,就交换位置,然后角标2和角标3比,若2大于3,就交换位置第一趟:3254718第二趟:2345178以此类推。。。。点击查看代码#include<bits/stdc++.h>usingnamespaces......
  • drf之认证、权限、频率控制、排序、过滤、分页
    【认证】models.py1fromdjango.dbimportmodels234#Createyourmodelshere.5classUser(models.Model):6username=models.CharField(max_length=50)7password=models.CharField(max_length=50)8user_type=models.IntegerFiel......
  • js带注释的冒泡排序算法
    一、简述冒泡排序(BubbleSort)是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果二者的顺序(如从大到小、首字母从A到Z)错误就交换。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法......
  • list集合的排序
    list集合的排序使用常用的sort方法排序和stream流的方式排序packagecom.liucy.meiriyilian.sort;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;importjava.util.stream.Collectors;/***@Authorli......
  • 常见的排序算法——希尔排序
    本文记述了希尔排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想给定元素之间的间隔h,将所有间隔为h的元素作为独立的待排序范围,可以得到h个这样的子范围。针对每个子范围执行插入排序,使得任意间隔为h的元素是有序的。然后缩小间距......
  • 合并k个已排序链表
    利用新的ArrayList合并k个链表 遍历提供给我们的数组,依次得到各个头结点。依次遍历每个头结点下的链表,把他们加入新的数组中。利用Collections.sort()方法得到有序的数组最后把这个新的数组转换成链表并返回。publicListNodemergeKLists(ArrayList<ListNode>lists){......
  • element表格自带sortable属性排序错乱问题
       参考:https://blog.csdn.net/qq_40004867/article/details/129835446?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-129835446-blog-126339196.235%5Ev43%5Epc_blog_bottom_relevance_base4&dept......
  • 八大排序算法
    八大排序冒泡排序/*稳定排序时间复杂度:O(n^2)空间复杂度:O(1)*/publicstaticvoidbubbleSort(int[]nums){for(inti=0;i<nums.length-1;i++){booleanflag=false;for(intj=0;j<nums.length......
  • SpringBoot项目中对定义的多个BeanPostProcessor排序
    前言BeanPostProcessor是Spring提供的一种扩展机制,可以让我们在bean初始化前后做一些额外的操作,Spring中的@Async,@Scheduled,@RabbitHandler等注解的底层实现都是BeanPostProcessor在起作用,如RabbitListenerAnnotationBeanPostProcessor。代码示例@Configurationpub......