• LeetCode学习_day1:原地算法


    原地算法:是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部份覆盖掉。

    范例:冒泡排序、选择排序、插入排序、希尔排序

    (1)冒泡排序:

    冒泡排序算法的原理如下:
    比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    针对所有的元素重复以上的步骤,除了最后一个。
    持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
    冒泡排序OC代码如下: 
    for (int i = 0; i<result.count; i++) {
            for (int j = 0; j<result.count-1-i; j++) {
                NSInteger left = [result[j] integerValue];
                NSInteger right = [result[j+1] integerValue];
                if (left<right) {
                    [result exchangeObjectAtIndex:j withObjectAtIndex:j+1];
                }
            }
        }
    NSLog(@"%@",result);

     (2)选择排序--不稳定排序

    选择排序算法的原理如下:
    n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
    ①初始状态:无序区为R[1..n],有序区为空。
    ②第1趟排序
    在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
    ……
    ③第i趟排序
    第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区
    选择排序的OC代码如下:
    NSMutableArray *sortArray = [NSMutableArray arrayWithObjects:@"3", @"8", @"1", @"5", nil];
        for (NSInteger i = 0; i < sortArray.count; i++) {
            NSInteger k = i;
            for (NSInteger j = i + 1; j < sortArray.count; j++) {
                //这一步我做错了,我的初始条件是 j = i, 没有考虑到,第一个元素 跟第二个元素对比就可以了,没有必要每次都第一个跟第一个开始对比
                NSInteger jValue = [sortArray[j] integerValue];
                NSInteger kValue = [sortArray[k] integerValue];
                if (jValue < kValue) {
                    k = j;
                }
            }
            [sortArray exchangeObjectAtIndex:i withObjectAtIndex:k];
        }
        NSLog(@"--%@---", sortArray);

    (3)插入排序--稳定排序

    插入排序算法的原理:
    算法设计有很多方法。插入排序使用的是增量(incremental)方法;在排好子数组A[1..j-1]后,将A[j]插入,形成排好序的子数组A[1..j];
    步骤
    ⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;
    ⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;
    ⒊重复第二步,共进行n-i次插入处理,数列全部有序。
    思路
    假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.
    插入排序算法的OC代码如下:
    NSMutableArray *sortArray = [NSMutableArray arrayWithObjects:@"3", @"8", @"1", @"5", @"9", @"2", nil];
        for (NSInteger i = 1; i < sortArray.count; i++) {
      //从第一个开始跟第0个比较,所以 i= 1
    if (sortArray.count <2) { break; } for (NSInteger j = i; j > 0; j--) { NSInteger rightV = [sortArray[j] integerValue]; NSInteger leftV = [sortArray[j - 1] integerValue]; if (rightV < leftV) { [sortArray exchangeObjectAtIndex:j withObjectAtIndex:j -1]; }else { break; } } } NSLog(@"--%@---", sortArray);
     
  • 相关阅读:
    Android网络框架OkHttp之get请求(源码初识)
    Android Studio运行报错,Cannot find System Java Compiler. Ensure that you have installed a JDK......
    Android基于xmpp的即时通讯应用
    Android 基于Http的多线程下载的实现
    1.3 Quick Start中 Step 3: Create a topic官网剖析(博主推荐)
    1.3 Quick Start中 Step 2: Start the server官网剖析(博主推荐)
    1.3 Quick Start中 Step 1: Download the code官网剖析(博主推荐)
    1.2 Use Cases中 Commit Log官网剖析(博主推荐)
    1.2 Use Cases中 Event Sourcing官网剖析(博主推荐)
    1.2 Use Cases中 Stream Processing官网剖析(博主推荐)
  • 原文地址:https://www.cnblogs.com/lyz0925/p/9503219.html
Copyright © 2020-2023  润新知