算法 quick sort

2024-08-30 07:18
文章标签 算法 sort quick

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

  1. // --------------------------------------------------------------------------------------------------------------------  
  2. // 
  3. //  
  4. // Respect the work.  
  5. //  
  6. // </copyright>  
  7. // <summary>  
  8. //  
  9. // The quick sort.  
  10. //  
  11. // 快速排序(QuickSort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。  
  12. //  
  13. // 设要排序的数组是a[0]...a[N-1],首先任意选取一个数据(通常选用数组的首元素)作为关键数据,然后将所有比它小的数都放到它的前面,所有比它大的数都放到它的后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。  
  14. // 一趟快速排序的算法是:  
  15. // 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;  
  16. // 2)以数组首元素作为关键数据,赋值给pivot,即pivot=a[0];  
  17. // 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于pivot的值a[j],将a[j]赋值给a[i];  
  18. // 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于pivot的值a[i],将a[i]赋值给a[j];  
  19. // 5)重复第3、4步,直到i==j;(在3、4步中,若没找到符合条件的值,即3中a[j]不小于pivot,4中a[i]不大于pivot的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。若找到符合条件的值,进行替换的时候i、j指针位置不变。)  
  20. //  
  21. // 快速排序的平均时间复杂度是:O(nlog<sub>2</sub>n)。  
  22. //  
  23. // </summary>  
  24. // --------------------------------------------------------------------------------------------------------------------  
  25.   
  26. namespace CSharpLearning  
  27. {  
  28.     using System;  
  29.   
  30.     /// <summary>  
  31.     /// The program.  
  32.     /// </summary>  
  33.     public static class Program  
  34.     {  
  35.         /// <summary>  
  36.         /// The main.  
  37.         /// </summary>  
  38.         public static void Main()  
  39.         {  
  40.             int[] a = { 101, 93, 856, 7, 62, 15, 84, 3, 298, 1256 };  
  41.             Console.WriteLine("Before Quick Sort:");  
  42.             foreach (int i in a)  
  43.             {  
  44.                 Console.Write(i + " ");  
  45.             }  
  46.   
  47.             Console.WriteLine("\r\n");  
  48.             Console.WriteLine("In Quick Sort:");  
  49.             QuickSort(a, 0, 9);  
  50.             Console.WriteLine("\r\nAfter Quick Sort:");  
  51.             foreach (int i in a)  
  52.             {  
  53.                 Console.Write(i + " ");  
  54.             }  
  55.   
  56.             Console.WriteLine(string.Empty);  
  57.         }  
  58.   
  59.         /// <summary>  
  60.         /// 快速排序。  
  61.         /// </summary>  
  62.         /// <param name="a">  
  63.         /// 待排序数组。  
  64.         /// </param>  
  65.         /// <param name="low">  
  66.         /// 待排序数组的排序起始位置。  
  67.         /// </param>  
  68.         /// <param name="high">  
  69.         /// 待排序数组的排序终止位置。  
  70.         /// </param>  
  71.         private static void QuickSort(int[] a, int low, int high)  
  72.         {  
  73.             if (low >= high)  
  74.             {  
  75.                 return;  
  76.             }  
  77.   
  78.             int pivot = QuickSortOnce(a, low, high);  
  79.   
  80.             // 输出每一次排序。  
  81.             foreach (int i in a)  
  82.             {  
  83.                 Console.Write(i + " ");  
  84.             }  
  85.   
  86.             Console.WriteLine(string.Empty);  
  87.   
  88.             // 对枢轴的左端进行排序。  
  89.             QuickSort(a, low, pivot - 1);  
  90.   
  91.             // 对枢轴的右端进行排序。  
  92.             QuickSort(a, pivot + 1, high);  
  93.         }  
  94.   
  95.         /// <summary>  
  96.         /// 一趟快速排序。  
  97.         /// </summary>  
  98.         /// <param name="a">  
  99.         /// 待排序数组。  
  100.         /// </param>  
  101.         /// <param name="low">  
  102.         /// 待排序数组的排序起始位置。  
  103.         /// </param>  
  104.         /// <param name="high">  
  105.         /// 待排序数组的排序终止位置。  
  106.         /// </param>  
  107.         /// <returns>  
  108.         /// 返回枢轴的位置。  
  109.         /// </returns>  
  110.         private static int QuickSortOnce(int[] a, int low, int high)  
  111.         {  
  112.             // 将首元素作为枢轴。  
  113.             int pivot = a[low];  
  114.             int i = low, j = high;  
  115.   
  116.             while (i < j)  
  117.             {  
  118.                 // 从右到左,寻找首个小于pivot的元素。  
  119.                 while (a[j] >= pivot && i < j)  
  120.                 {  
  121.                     j--;  
  122.                 }  
  123.   
  124.                 // 执行到此,j一定指向从右端起首个小于或等于pivot的元素。执行替换。  
  125.                 a[i] = a[j];  
  126.   
  127.                 // 从左到右,寻找首个大于pivot的元素。  
  128.                 while (a[i] <= pivot && i < j)  
  129.                 {  
  130.                     i++;  
  131.                 }  
  132.   
  133.                 // 执行到此,i一定指向从左端起首个大于或等于pivot的元素。执行替换。  
  134.                 a[j] = a[i];  
  135.             }  
  136.   
  137.             // 退出while循环,执行至此,必定是i==j的情况。i(或j)指向的即是枢轴的位置,定位该趟排序的枢轴并将该位置返回。  
  138.             a[i] = pivot;  
  139.             return i;  
  140.         }  
  141.     }  
  142. }  
  143.   
  144. // Output:  
  145. /* 
  146. Before Quick Sort: 
  147. 101 93 856 7 62 15 84 3 298 1256 
  148.  
  149. In Quick Sort: 
  150. 3 93 84 7 62 15 101 856 298 1256 
  151. 3 93 84 7 62 15 101 856 298 1256 
  152. 3 15 84 7 62 93 101 856 298 1256 
  153. 3 7 15 84 62 93 101 856 298 1256 
  154. 3 7 15 62 84 93 101 856 298 1256 
  155. 3 7 15 62 84 93 101 298 856 1256 
  156.  
  157. After Quick Sort: 
  158. 3 7 15 62 84 93 101 298 856 1256 
  159. */  

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



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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯: