首页 > 其他分享 >快速排序

快速排序

时间:2023-07-25 12:56:10浏览次数:35  
标签:int high while low key 排序 快速 define

本文章的代码使用jetbrains公司旗下的的Clion编写,操作系统位macOS Ventura(13.2.1). 代码没有在dev-c++测试过(dev-c++可能会有相关的空格问题)
【对书上的内容进行了一点更新和优化,主要是对未知的特殊情况处理】

//
// Created by 魏志杰 on 2023/7/25.
//

#include "stdio.h"
#define Max 100
#define before  printf("排序前")
#define after   printf("排序后")
#define newline printf("\n")
#define print   printf("%6d", R[i].key)
#define printA  printf("%6d",A[i])
#define Array int A[]={5,7,2,5,9,6,-42,1,67,2,3};


typedef struct{
   int key;
   int data;
}SqType;



//从数列中挑出一个元素,称为 "基准"(pivot);
//重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
//递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

//严蔚敏《数据结构》,标准分割函数

int partition(int A[], int low, int high) {
   int pivot = A[low];
   while (low < high) {
       while (low < high && A[high] >= pivot) {
           --high;
       }
       A[low] = A[high];
       while (low < high && A[low] <= pivot) {
           ++low;
       }
       A[high] = A[low];
   }
   A[low] = pivot;
   return low;
}

void quickSort(int A[], int low, int high) {
   if (low < high) {
       int pivot = partition(A, low, high);
       quickSort(A, low, pivot - 1);
       quickSort(A, pivot + 1, high);
   }
}

//李春葆
void quick(SqType R[], int s, int t) {
   int i = s, j = t;
   SqType tmp;
   if (s < t) {
       tmp = R[s];
       while (i != j) {
           while (j > i && R[j].key >= tmp.key)
               j--;
           if (i < j) {
               R[i] = R[j];
               i++;
           }
           while (i < j && R[i].key <= tmp.key)
               i++;
           if (i < j) {
               R[j] = R[i];
               j--;
           }
       }
       R[i] = tmp;
       quick(R, s, i - 1);
       quick(R, i + 1, t);
   }
}

void quick_1(SqType R[], int s, int t) {
   if (s >= t) { // 处理特殊情况:当 s >= t 时,不需要继续排序,直接返回
       return;
   }

   int i = s, j = t;
   SqType tmp = R[s]; // 将基准元素保存在临时变量 tmp 中
   while (i < j) {
       while (j > i && R[j].key >= tmp.key)
           j--;
       if (i < j) {
           R[i] = R[j];
           i++;
       }
       while (i < j && R[i].key <= tmp.key)
           i++;
       if (i < j) {
           R[j] = R[i];
           j--;
       }
   }
   R[i] = tmp;

   quick(R, s, i - 1); // 递归排序左半部分
   quick(R, i + 1, t); // 递归排序右半部分
}


int  main(){

   SqType R[Max];
   Array;
   for (int i = 0; i < 10; i++)
       R[i].key = A[i];
   before;
   for (int i = 0; i < 10; i++)
       print;
      newline;

   quick(R,0,9);
   after;
   for (int i = 0; i < 10; i++)
       print;
   newline;

   quick_1(R,0,9);
   after;
   for (int i = 0; i < 10; i++)
       print;
   newline;

   quickSort(A,0,9);
   after;
   for (int i = 0; i < 10; i++)
       printA;

}


}

结果如下

标签:int,high,while,low,key,排序,快速,define
From: https://www.cnblogs.com/xiaozhounandu/p/17579617.html

相关文章

  • 希尔排序
    本文章的代码使用jetbrains公司旗下的的Clion编写,操作系统位macOSVentura(13.2.1).代码没有在dev-c++测试过(dev-c++可能会有相关的空格问题)////Createdby魏志杰on2023/7/25.//#include"stdio.h"#defineMax100#definebeforeprintf("排序前")#defineafterp......
  • 折半排序
    本文章的代码使用jetbrains公司旗下的的Clion编写,操作系统位macOSVentura(13.2.1).代码没有在dev-c++测试过(dev-c++可能会有相关的空格问题)////Createdby魏志杰on2023/7/25.//#include"stdio.h"#defineMax100#definebeforeprintf("排序前")#defineafterp......
  • 直接插入排序
    本文章的代码使用jetbrains公司旗下的的Clion编写,操作系统位macOSVentura(13.2.1).代码没有在dev-c++测试过(dev-c++可能会有相关的空格问题)#defineMax100#definebeforeprintf("排序前")#defineafterprintf("排序后")#definenewlineprintf("\n")#defineprint......
  • 我开源了团队内部基于SpringBoot Web快速开发的API脚手架v1.6.0更新
    什么是rest-api-spring-boot-starterrest-api-spring-boot-starter适用于SpringBootWebAPI快速构建让开发人员快速构建统一规范的业务RestFullAPI不在去关心一些繁琐。重复工作,而是把重点聚焦到业务。动机每次WebAPI常用功能都需要重新写一遍。或者复制之前的项目代码......
  • jQuery快速入门
    我们最好称之为是jQuery库更好一些,不要称之为是框架#库就类似于是Python中的模块,简称为jq#jQuery就是js、css等的封装版本,只要一封装,写法肯定会简单jQuery介绍jQuery是一个轻量级的、兼容多浏览器的JavaScript库。#他就是一个封装好的js文件,几十KB大小#前端的最大问题就......
  • 用Java集合中的Collections.sort方法对list排序的两种方法
    用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下:   <strong>/**02 *根据order对User排序03 */04 publicclassUserimplementsComparable{05 privateStringname;06 privateIntegerorder;07 publicStringgetN......
  • jQuery快速入门
    jQuery库一般称之为jQuery库,不要称为框架,库类似于Python中的模块,简称jqjQuery就是js、css等的封装版,只要已封装,写法肯定简单一些 jQuery介绍jQuery是一个轻量级的、兼容多浏览器的JavaScript库。#他就是一个封装好的js文件,几十KB大小前端的最大问题就是兼容性问......
  • openpyxl-数据排序,过滤器
    过滤器,数据排序fromopenpyxlimportWorkbookwb=Workbook()sheet=wb.activedata=[['Item','Colour'],['pen','brown'],['book','black'],['plate','white'],[�......
  • 快速检测HTTP代理IP是否有效的方法及python代码示例
     1.使用在线代理检测工具:有许多免费的在线代理检测工具可用,如ProxyChecker、ProxyScrape等。只需将待检测的代理IP和端口输入工具中,点击开始检测,即可迅速获得代理的可用性和匿名性等信息。 2.使用命令行工具进行检测:在命令行中使用curl命令来测试代理的可用性。例如,输入命令"......
  • Windows在资源管理器地址栏输入不用鼠标快速启动程序
    Windows用户一般打开东西,都是双击某个图标,还有一种是在命令行启动。但是,还有一个地方可以直接启动,就是我们常用的资源管理器(在桌面上,以前叫我的电脑、计算机)的那个图标里,地址栏就可以直接输入。1.启动:VisualStudioCode(简称vscode)当输入v的时候,系统会自动搜索桌......