啊哈!算法 学习2 排序 - 快速排序 2分发排序

#import <Foundation/Foundation.h>
int a[101],n;

void quickSort(int left,int right);

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        for (int i = 0; i<10; i++) {
            scanf("%d",&a[i]);
        }
        quickSort(0, 9);
        for (int i = 0; i < 10; i++) {
            NSLog(@"tt == %d",a[i]);
        }
    }
    return 0;
}
void quickSort(int left,int right)
{
    if (left > right)
    {
        return;
    }

    int i,j,t,temp;
    temp = a[left];
    i = left;
    j = right;
    while (i!=j)
    {
        while (a[j] <= temp && j>i) {
            j--;
        }
        while (a[i] >= temp &&i < j) {
            i++;
        }
        if (i < j)
        {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }

    a[left] = a[i];
    a[i] = temp;
    quickSort(left, i-1);
    quickSort(i+1, right);

}

demo

时间: 2024-10-07 18:20:12

啊哈!算法 学习2 排序 - 快速排序 2分发排序的相关文章

数据结构和算法学习六,之非递归排序

http://blog.csdn.net/feixiaoxing/article/details/6844826 在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差别是非常明显的.既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结. 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主

算法学习~分治法~快速排序

天天都在排序..简直就是要给这个混乱的世界一个正确的秩序..不过嘛.排序也有快慢之分, 冒泡排序法,,思路很简单就是一个个上去打擂台,,这样的时间复杂度很糟糕,,O(N^2)中O是一个常数,O(N^2)是指最大上限(估值)n(n-1)/2 = (n^2 - n)/2最高位估值仍为n^2两种情况是一样的. 选择排序法,,每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前(最后),直到全部待排序的数据元素排完.选择排序是不稳定的排序方时间复杂度为O(n),最坏情况下

算法学习(二):O(n^2)排序算法

总结一下学习的复杂度为O(n^2)的三种排序算法:选择排序,插入排序,希尔排序. (1)选择排序:从第一个位置开始每次查找剩下的位置中最小的数值放入当前位置: (2)插入排序:从第二个位置开始,每次都将当前位置的数值插入前面合适的位置,对于几乎有序的数列来说,插入排序能带来更高的效率: (3)希尔排序:变步长区间的插入排序,指定一个步长衰减率,每一轮插入排序都将间隔指定步长的数值排序完成,当步长衰减为1时,就成了标准的插入排序. 代码实现: (1)选择排序 var selectSort = fu

数据结构学习笔记06排序 (快速排序、表排序)

1.快速排序 不稳定 分而治之 找主元pivot,小于主元划分为一个子集,大于主元的划分为一个子集 然后进行递归 最好情况:每次主元正好中分,T(N) = O( NlogN ) 选主元 的方法有很多,这里用 取头.中.尾的中位数. 直接选A[0]为pivot,时间复杂度T ( N ) = O( N ) + T ( N–1 ) = O( N ) + O ( N–1 ) + T( N–2 ) = = O( N ) + O ( N–1 ) + …+ O( 1 ) = O( N^2 ) 随机取pivot

算法学习---分治法和快速排序

"分治者,分而治之也"分治法的主要思想就是1.若问题足够小,解决并返回 2.若问题规模不够小,减小问题规模.分治法,很容易理解,就是大而化小,小而化了的思想,把问题划分成你能解决的问题. // 分治法 divide_and_conquer(P) { if(|P|<=n0){ process(P); } else{ divide P into smaller subinstances P1,P2,...,Pk for(int I=1;I<k;i++) yi=divide_an

php排序-快速排序-冒泡排序-顺序排序

//快速排序 $arr = array(32,31,56,4,234,46,466,86,5); function kuaisu($arr){if(!is_array($arr) || empty($arr)){return array();}//获取数组的长度$len = count($arr); //如果数组中只有一个元素,直接返回数组if($len <= 1){return $arr;}$key[0] = $arr[0];$left = array();$right = array();

排序算法学习之快速排序

快速排序基本思想:选取一个枢轴元素(图简单可选第一个),通过对序列一次遍历(中间涉及到数的交换),将该枢轴放置到序列合适位置,保证其左边数都比它小,右边数都比它大,然后利用递归思想对其左右两个子序列进行同样排序. 快熟排序的基本实现过程:将枢轴元素key备份,序列头尾各设置一个游标--i和j,尾部游标j先移动(如果选择的最后一个元素为枢轴则i先移),直到遇到比key小的元素,将其移到原枢轴处覆盖之,此时j处元素空着了,然后再对i进行移动,直到遇到比key大的元素,将其移到右边下表为j的空白处 v

基础算法之排序--快速排序

1 /************************************************************************************** 2 * Function : 快速排序 3 * Create Date : 2014/04/21 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性. 7 * 任何单位和个人不经本人允许不

几种排序算法的C++实现——快速排序、堆排序、基数排序

排序算法是非常常见的面试笔试问题,考查的一个人的基本功,本文将一些排序做了C++的实现,就当是做个学习总结吧. 1.快速排序 快速排序的中心是填坑法,取一个数(这里选取第一个数)作为基准数temp,从队尾开始寻找第一个比基准数小的数a[j],交换a[j]和temp,然后队首开始查找第一个比temp大的数a[i],交换之,遍历的结果是当i>=j时,temp左边的数都小于temp,后边的数都大于temp,这个有点像归并排序.最后利用递归调用完成排序,代码如下: 1 void QuickSort(in