快速排序

DS排序--快速排序

强颜欢笑 提交于 2020-01-12 17:13:48
题目描述 给出一个数据序列,使用快速排序算法进行从小到大的排序 --程序要求 -- 若使用 C++只能 include一个头文件 iostream;若使用 C语言只能 include一个头文件 stdio 程序中若 include多过一个头文件,不看代码,作 0分处理 不允许使用第三方对象或函数实现本题的要求 输入 第一行输入t,表示有t个测试示例 第二行输入n,表示第一个示例有n个数据 第三行输入n个数据,都是正整数,数据之间用空格隔开 以此类推 输出 每组测试数据,输出每趟快排的结果,即每次排好一个数字结果(长度为1的子序列,不用排,不用输出)。不同测试数据间用空行分隔。 样例输入 2 6 111 22 6 444 333 55 8 77 555 33 1 444 77 666 2222 样例输出 55 22 6 111 333 444 6 22 55 111 333 444 6 22 55 111 333 444 6 22 55 111 333 444 1 33 77 555 444 77 666 2222 1 33 77 555 444 77 666 2222 1 33 77 77 444 555 666 2222 1 33 77 77 444 555 666 2222 1 33 77 77 444 555 666 2222 提示 #include<iostream>

'C语言' | 快速排序算法

时光总嘲笑我的痴心妄想 提交于 2020-01-12 01:30:25
快速排序 【算法描述】 快速排序算法是排序算法中一般情况下时空复杂度较小的排序算法,快速排序的算法思想是:选定一个轴值为基准,将整个序列划分为两个子序列,通过排序将轴值前的数值都是比它小的,轴值后的数值都是比它大的值,然后依次对每个部分进行划分。 【算法思路】 以第一个记录作为轴值,对待排序序列进行划分的过程为: (1)初始化:取第一个记录作为基准,设置两个参数i,j分别用来指示将要与基准记录进行比较的左侧记录位置和右侧记录位置,也就是本次划分的区间; (2)右侧扫描过程:将基准记录与j指向的记录进行比较,如果j指向记录的关键码大,则j前移一个记录位置。重复右侧扫描过程,直到右侧的记录小(即反序),若i<j,则将基准记录与j指向的记录进行交换; (3)左侧扫描过程:将基准记录与i指向的记录进行比较,如果i指向记录的关键码小,则i后移一个记录位置。重复左侧扫描过程,直到左侧的记录大(即反序),若i<j,则将基准记录与i指向的记录交换; (4)重复(2)(3)步,直到i与j指向同一位置,即基准记录最终的位置。 【操作描述】 【算法实现】 # include <stdio.h> int Partition ( int r [ ] , int First , int End ) ; void Quicksort ( int r [ ] , int First , int End ) ;

快速排序算法

浪尽此生 提交于 2020-01-11 23:58:04
  快速排序算法跟归并排序算法一样,都是利用的是分治原则,通过不断将一个未排序的数组进行划分排序,直到最后组成一个有序的数组。快速排序算法的原理就是从未排序的数组中取出一个数(一般是第一个或者是最后一个元素)作为主元,将未排序数组中小于这个主元的元素放在主元的左边,大于主元的元素放在主元的右边。然后再将主元左边小于主元的所有元素按照上面的方法进行处理,右边的元素也一样,以此类推。直到划分到最后左右两边的数组只剩下一个元素,排序就完成了。接下来我们用一幅图来演示下快速排序算法:   从上面的图中可以看出划分完成时,数组排序就完成了。   下面为快速排序算法的java代码:   程序分为两个方法,方法QuickSort进行判断是否继续进行划分,方法Partition进行选取主元,对未排序数组进行划分。 public static void QuickSotrt(int[] array,int head,int tail){ if(head < tail){ // 获取主元位置 int k = Partition(array, head, tail); // 对主元左边元素进行再次划分 QuickSotrt(array, head, k-1); // 对主元右边数组进行再次划分 QuickSotrt(array, k+1, tail); } } public static int

js排序算法05——快速排序

本秂侑毒 提交于 2020-01-11 23:57:30
终于到了传说中的快速排序算法了,快速排序的思想和归并排序一样,都是采用分治思想,不同之处在于归并每次将数组一分为二,最后将小的数组进行比较,合并为大数组。快排是每次找一个主元,也就是基准数,按照这个基准数,把小于基准数的数放左边,大于基准数的数放右边,通过基准数来分组实现排序。所以快排的很重要一步就是选择主元,主元选取的是否合适直接影响到算法的效率。我的方法是每次从子数组中三个数(首、尾、中),取他们的中位数作为主元,分析到此结束,直接上code function quickSort(arr,left,right){ if(right-left<=1){ return arr; } else{ var l=left,r=right,m=parseInt((r+l)/2); var pivot,cup; if(arr[l]>arr[m]){ cup = arr[m]; arr[m] = arr[l]; arr[l] = cup; } if(arr[m]>arr[r]){ cup = arr[m]; arr[m] = arr[r]; arr[r] = cup; } if(arr[l]>arr[m]){ cup = arr[m]; arr[m] = arr[l]; arr[l] = cup; } pivot = arr[m]; cup = arr[r-1]; arr[r-1] = arr

算法-快速排序

帅比萌擦擦* 提交于 2020-01-11 23:57:15
快速排序应该是应用最广泛的算法,流行的原因主要是因为实现简单,适用于不同的输入数据且在一般应用中比其他算法都快的多,其实跟上篇文章中的归并排序差不多类似,主要是通过分治思想,将数组不断的切割,最后求解。不过两者不同的是归并排序是在递归之后进行比较,也就是说递归之前左右两边的数据是无序的,快速排序是在递归之前先将数组进行排序,就是递归之前的左右两边的数组都是有序的,时间复杂度为O(nlogn). 快排递归代码: -(void)quickSort:(NSMutableArray *)arr lowIndex:(NSInteger)low highIndex:(NSInteger)high{ if (low>=high) { return; } NSInteger j=[self partiticon:arr lowIndex:low highIndex:high];//获取切割位置 [self quickSort:arr lowIndex:low highIndex:j-1];//左边排序数组arr[low..j-1] [self quickSort:arr lowIndex:j+1 highIndex:high]; } -(NSInteger)partiticon:(NSMutableArray *)arr lowIndex:(NSInteger)low highIndex:

快速排序模板 C++ and python

半腔热情 提交于 2020-01-10 21:14:44
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N = 1e5 + 5; int a[N]; void quick_sort(int q[], int l, int r) { if(l >= r) return ; int x = q[l + r >> 1], i = l - 1, j = r + 1; while(i < j) { do ++ i;while(q[i] < x); do -- j;while(q[j] > x); if(i < j) swap(q[i], q[j]); //** } quick_sort(q, l, j); quick_sort(q, j + 1, r); return ; } int main() { int n; scanf("%d", &n); for(int i = 0; i < n; ++ i) scanf("%d", &a[i]); quick_sort(a, 0, n - 1); for(int i = 0; i < n; ++ i) printf("%d ", a[i]); return 0; } def quick_sort(q, L, R): if L >= R: return x = q[L +

二分法快速排序

风格不统一 提交于 2020-01-10 03:58:36
我在实现二分法快速排序的时候,最初的程序是这样的。 # include <iostream> using namespace std ; void qsort ( int arr [ ] , int left , int right ) { int l = left ; int r = right ; int value = arr [ l ] ; do { while ( l < r && arr [ r ] >= value ) r -- ; if ( arr [ r ] < value ) { arr [ l ] = arr [ r ] ; l ++ ; } while ( l < r && arr [ l ] <= value ) l ++ ; if ( arr [ l ] > value ) { arr [ r ] = arr [ l ] ; r -- ; } } while ( l != r ) ; arr [ l ] = value ; qsort ( arr , left , r -- ) ; qsort ( arr , l ++ , right ) ; } int a [ 100 ] ; int main ( ) { freopen ( "1.txt" , "r" , stdin ) ; freopen ( "2.txt" , "w" , stdout ) ;

快速排序

左心房为你撑大大i 提交于 2020-01-10 02:25:23
排序算法采用了一种分治的策略,即将大模块划分成同样的小模块。 快排的基本思想: 先从数组中取出一个数作为基准数,通常取数组的第一个元素作为基准数 分区过程,将比基准数大的数放到他的右边,小于或等于他的数放到左边 经过一次分区后,便可以将原数组分成基准数的左边都小于等于基准数,而右边都大于基准数的数组。重复第2步的过程,直到区间只有一个数,最终就可以得到一个有序的数组 快速排序实际上就是挖坑+填数+分治的过程。 以一个数组arr为例,取第一个数作为基准数 0 1 2 3 4 5 6 7 8 9 72 6 55 80 60 90 42 73 48 100 初始时 i=0,j=5,x=arr[0]。 由于已经将arr[0]保存到x了,所以arr[0]可以被其他数填充了,相当于在arr[0]上挖了个坑。 j从右向左遍历数组,找第一个小于等于x的数,在j=8的位置满足要求,将arr[8]挖出填到arr[0]中,同时i++,此时arr[8]多出一个坑位,等待其他数填充。i从左向右遍历,找到第一个比x大的数,i=3符合要求,将arr[3]的数取出填到arr[8]中,同时j--,数组变为 0 1 2 3 4 5 6 7 8 9 48 6 55 80 60 90 42 73 80 100 此时i=3,j=7,x=72; 再重复上面的步骤,先从后向前找,再从前向后找。 从j开始向前找,j=6,符合条件

快速排序

佐手、 提交于 2020-01-10 01:50:24
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 标题步骤为: 从数列中挑出一个元素,称为"基准"(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 代码实现 def quick_sort ( alist , start , end ) : """快速排序""" # 递归的退出条件 if start >= end : return # 设定起始元素为要寻找位置的基准元素 mid = alist [ start ] # low为序列左边的由左向右移动的游标 low = start #

传说中的二分查找和快速排序

独自空忆成欢 提交于 2020-01-10 01:49:31
1、二分查找 /* 二分查找(折半查找),前提是在已经排好序的数组中 通过将待查找的元素与中间索引值对应的元素进行比较, 若大于中间索引值对应的元素,去右半部分查找,否则去左半部分查找 一次类推,知道找到位置 */ public class Test8 { public static void main ( String [ ] args ) { int [ ] nums = { 10 , 20 , 50 , 65 , 88 , 90 } ; //待查找数组 int index = binarySearch ( nums , 90 ) ; System . out . println ( index ) ; } //二分查找数列 public static int binarySearch ( int [ ] num , int key ) { int start = 0 ; //开始下标 int end = num . length - 1 ; //结束下标 while ( start <= end ) { int middle = ( start + end ) / 2 ; //>>>1 if ( num [ middle ] > key ) { end = middle - 1 ; } else if ( num [ middle ] < key ) { start =