【快排】

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int n;
 5 const int maxn=1e5+2;
 6 int s[maxn];
 7
 8 void quick_sort(int l,int r)
 9 {
10     if(l>=r) return;
11     int x=s[l];
12     int i=l,j=r;
13     while(i<j)
14     {
15         while(i<j&&s[j]>=x) j--;
16         if(i<j) s[i++]=s[j];
17         while(i<j&&s[i]<x) i++;
18         if(i<j) s[j--]=s[i];
19     }
20     s[i]=x;
21     quick_sort(l,i-1);
22     quick_sort(i+1,r);
23 }
24 int main()
25 {
26     while(~scanf("%d",&n))
27     {
28         for(int i=1;i<=n;i++)
29         {
30             scanf("%d",&s[i]);
31         }
32         quick_sort(1,n);
33         for(int i=1;i<=n;i++)
34         {
35             printf("%d ",s[i]);
36         }
37         printf("\n");
38     }
39     return 0;
40 }

时间: 2024-10-15 05:28:29

【快排】的相关文章

算法学习——单链表快排

/**  * 以p为轴对start-end间的节点进行快排(包括start && 不包括end):  * 思路:  * 1.将头节点作为轴节点start,从start.next开始遍历,如果节点小于轴start的值,将该节点插入到轴节点后面:  * 2.将轴节点插入合适位置,即找到最后一个小于轴的节点,将该节点与轴节点值互换,此时就链表分为两部分,小于轴节点和大于轴节点:  * 3.递归的遍历2中两部分节点.  *   * @param p  * @param start  * @para

快排的递归和非递归

常用的快排都是用递归写的,因为比较简单,但是可以用栈来实现非递归的快排. 第一种是递归的快排 #include<stdio.h> #include <stdlib.h> #include <time.h> int quick(int a[],int i ,int j) {     int tmp=0,key,b=0;     int im,jm;     im=i;     jm=j;     key=a[i];     if(i>j)         retur

快排,随机快排,双路快排,三路快排的理解

再讲快排之前,首先对于任何一个数组,无论之前是多么杂乱,排完之后是不是一定存在一个数作为分界点(也就是所谓的支点),在支点左边全是小于等于这个支点的,然后在这个支点右边的全是大于等于这个支点的,快排过程就是寻找这个支点过程 先看普通的快排(普通单路快排) 代码如下 let findIndex = (arr, l, len) => { let par = arr[l], j = l for (let i = l + 1; i <= len; i++) { if (arr[i] < par)

Quick Sort(快排)

这是挖坑填补法的演示 快排之挖坑填补法: 1 void Quick(int top/*起始位置*/,int end/*末尾位置*/,int arr[])//挖坑填补法 2 { 3 int i=top,j=end,mark;//i是记住前面的坑 j记住后面的坑 mark记住标准值 4 5 mark=arr[top];//以起始位置作为标准值,同时起始点成为第一个坑 6 if(top>=end)return; 7 while(i<j) 8 { 9 while(i<j)//从后向前找比标准值小

冒泡,快排代码+注释

冒泡: package Sort; public class BubbleSort { public static void main(String[] args) { int[] list = new int[]{12,14,3,24,1,33}; int[] nums = bubbleSort(list); for(int i = 0;i< list.length;i++){ System.out.println(nums[i]); } } public static int[] bubbl

C++ 快排

// 进行一轮快排并返回当前的中间数 int getMiddle( int* arr, int low, int high ) { auto swaparr = [&]( int i, int j ) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; }; if( high - low > 0 ) { int k = arr[low], i = low, j = high; while( i != j ) { //R->L for(

python 冒泡和快排,不多说【无聊】

1 #-*-coding:utf8-*- 2 import random 3 a=[] 4 b=[] 5 def init_array(): 6 for i in range(10000): 7 v = random.randint(1,10000) 8 a.append(v) 9 b.append(v) 10 11 #冒泡 12 def sort_array(a): 13 for i in range(len(a)): 14 for j in range(i+1,len(a)): 15 if

快排的第4个参数

问题描述 我想写个能够排序多种类型的函数.   当我着手排序字符串时,  发现直接把strcmp传递给qsort后, 无法正常排序. 解决方法 我注意到strcmp的参数与快排第4个参数的形参并不一致.  我便自己写了个比较函数, 问题solved! 附上 1 /* 2 ** 比较两个字符串 3 */ 4 int str_cmp ( void const *p1, void const *p2 ) 5 { 6 char *str1; 7 char *str2; 8 9 str1 = *(char

数字在排序数组中出现的次数(剑指offer)利用快排思想(O(logn))

数字在排序数组中出现的次数 参与人数:1216时间限制:1秒空间限制:32768K 通过比例:28.43% 最佳记录:0 ms|0K(来自 ) 题目描述 统计一个数字在排序数组中出现的次数. 题意:首先数组是个已经排列的有序递增序列!统计一个数出现的次数,相当于在有序的序列里插入一个数,那么我只要确定插入的位置,利用快排的思想,也可以说是二分,如果在数组中找到k,那么左右拓展边界就可以确定,该数在数组中出现的次数了. 一些特殊情况可以特判!比如k小于数组最小数,或者大于数组最大数: class

Python实现排序(冒泡、快排、归并)

Thomas H.Cormen 的<算法导论>上介绍的几个经典排序算法的Python实现. 1.冒泡排序: 简单的两重循环遍历,使最小(最大)的值不断地往上升(下沉)而实现的排序,算法时间为O(n2). 代码如下: 1 def up_sort(a): 2 # 冒泡排序 3 4 a_length = len(a) 5 while True: 6 i = 0 7 j = 1 8 9 while True: 10 if a[i] > a[j]: 11 a[i], a[j] = a[j], a[