Sorting Algorithms

2024-06-02 08:32
文章标签 algorithms sorting

本文主要是介绍Sorting Algorithms,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

[TOC]

PART 1 内排序

插入排序

** 直接插入排序
**二分插入排序
**希尔排序

交换排序

** 冒泡排序
** 快速排序



交换排序

冒泡排序

基本思想:

通过无序区中相邻记录关键字间的比较和位置的交换,使关键字最小的(最大的)记录如气泡一般逐渐往上“漂浮”直至“水面”。

给出“两种”形式的冒泡,自行斟酌

大者上浮

void BubbleSort(int[] arr){int n = arr.length;for(int i = 0; i < n; i++){for(int j = 0; j < n-i-1; j++){if(arr[j]>arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}

小者下沉

void BubbleSort(int[] arr){int n = arr.length;for(int i = 0; i < n; i++){for(int j = n-1; j > i; j--){if(arr[j]<arr[j-1]){int tmp = arr[j];arr[j] = arr[j-1];arr[j-1] = tmp;}}}
}

快速排序 , 首先快排是由冒泡排序改进而来。

快排思想:
在待排序的n个记录中任取一个记录(通常第一个),把该记录放入适当的位置后,数据序列被划分成两份。所有关键字比该记录关键字小的记录放在前一部分,比它大的记录放置在后一部分,并把该记录放在两部分中间(称为该记录归位),这个过程称做一趟快速排序。之后对所有的两部分重复上述的过程,直至每部分内只有一个记录或空为止。

简而言之,每趟使表的第一个元素放入适当位置,将表一分为二,对子表按递归方式继续划分,直至划分的子表长度为1或0。

以第一个记录为分割点

void QuickSort(int[] arr,int low, int high){int i = low, j = high;if(low < high) {                   //至少两个元素int pivot = arr[low];         while(i!=j) {                  //while(j > i && arr[j] > pivot)   //从右向左扫描 找比pivot小的元素j--;arr[i] = arr[j];                 while(i < j && arr[i] < pivot)   //从左往右扫描i++;arr[j] = arr[i];}arr[i] = pivot;sort(arr, low, i-1);sort(arr, i+1, high);}}

Another:
以最后一个为分割点

/* This function takes last element as pivot,places the pivot element at its correctposition in sorted array, and places allsmaller (smaller than pivot) to left ofpivot and all greater elements to rightof pivot */int partition(int arr[], int low, int high) {int pivot = arr[high];int i = low -1;// index of smaller elementint tmp;if(low<high) {          for(int j = low; j < high; j++) {// If current element is smaller than or// equal to pivotif(arr[j] < pivot) {//swap arr[i] and arr[j]i++;tmp = arr[j];arr[j] = arr[i];arr[i] = tmp;}}           //swap arr[i+1] and arr[high](pivot)tmp = arr[i+1];arr[i+1] = arr[high];arr[high] = tmp;            }return i+1;}/* The main function that implements QuickSort()arr[] --> Array to be sorted,low  --> Starting index,high  --> Ending index */void sort(int[] arr, int low, int high) {/* pi is partitioning index, arr[pi] is now at right place */int pi = partition(arr, low, high);// Recursively sort elements before// partition and after partitionsort(arr, low, pi-1);sort(arr, pi+1, high);}

选择排序

直接选择
堆排序

直接选择

基本思想:
第i趟排序开始时,当前有序区和无序区R[0..i-1]和R[i..n-1] (0<= i =>n-1),该趟排序则是从当前无序区中选出关键字最小的记录R[k],将它与无序区的第一个记录R[i]交换,使R[0..i] 和 R[i+1 .. n-1]分别变为新的有序区和新的无序区,即第i趟之后,R[0..i]有序区中的关键字均小于等于R[i+1..n-1]中所有关键字,所以进行n-1趟排序后,R[0..n-2]的所有关键字小于等于R[n-1],也就是n-1趟之后,整个表R[0..n-1]递增有序。

这篇关于Sorting Algorithms的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023456

相关文章

Sorting It All Out POJ(拓扑排序+floyd)

一个就是简单的拓扑排序,一个就是利用floyd判断是否存在环 #include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;#define MAXD 30#define MAX_SIZE 1000vector<int>G[MAXD];int n,m;char L[MAX

Study Plan For Algorithms - Part24

1. 包含min函数的栈 定义栈的数据结构,要求在该类型中实现一个 min 函数,能够获取栈的最小元素。在该栈中,调用 min、push 以及 pop 函数的时间复杂度均为 O (1)。 方法: class MinStack:def __init__(self):self.stack = []self.min_stack = [float('inf')]def push(self, x):sel

torch.backends.cudnn.benchmark和torch.use_deterministic_algorithms总结学习记录

经常使用PyTorch框架的应该对于torch.backends.cudnn.benchmark和torch.use_deterministic_algorithms这两个语句并不陌生,在以往开发项目的时候可能专门化花时间去了解过,也可能只是浅尝辄止简单有关注过,正好今天再次遇到了就想着总结梳理一下。 torch.backends.cudnn.benchmark 是 PyTorch 中的一个设置

[LeetCode] 969. Pancake Sorting

题:https://leetcode.com/problems/pancake-sorting 题目大意 对于数组A,可进行 k-reverse操作,即将 前k个元素翻转,求能使A为升序的 k-reverse 操作顺序。 解题思路 分析k操作,k-reverse操作只会影响 前面的数,不会影响 数组中后面的数,所以思路是逐步将最大元素 放置在合适的位置。 先拷贝 A 为 Abackup,

Sorting (Merge Sort, Rainball Sort, quick select) 总结

Merge k Sorted Lists (这题是用PQ,或者merge sort都可以做,关于第K大的问题,参考: Find Kth 题目类型总结) Sort an Array (重点掌握merge sort和quick sort,因为两者可以演变为,divide conquer, quick select, 参考: Find Kth 题目类型总结) Sort Colors 思路:三指针,i

Study Plan For Algorithms - Part21

1. 二叉树的镜像 输入一个二叉树,输出它的镜像。 方法一: class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef mirrorTree(root):if not root:return Nonetemp, left,

General Algorithms - Graph

BFS Red Knights Shortest Path - World CodeSprint 12 - DFS Even TreeRoads and Libraries MST Kruskal MST Really Special Subtree A BFS Red Knight’s Shortest Path - World CodeSprint

【POJ3270】【Cow Sorting】

Cow Sorting Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 6411 Accepted: 2488 Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each

Code Practice Journal | Day58_Graph08 Topological Sorting

1. 概念 在一个有向无环图(DAG)中,根据节点的依赖关系,对所有的节点进行线性排序的算法 拓扑排序的结果不一定是唯一的 2. 实现 2.1 BFS(卡恩算法) 1、步骤 2、代码实现 以KamaCoder 117.软体构建 题目:117. 软件构建 (kamacoder.com) class Program{public static void Main(string

学懂C++(四十六):深入探索C++ STL算法(Algorithms):从基础到高级应用

目录 引言 1. STL算法概述 2. 非修改性算法 2.1 std::find 2.2 std::count 3. 修改性算法 3.1 std::copy 3.2 std::replace 4. 排序算法 4.1 std::sort 4.2 std::stable_sort 5. 数值算法 5.1 std::accumulate 5.2 std::inner_prod