美文网首页
八大排序之快速排序

八大排序之快速排序

作者: Source_Chang | 来源:发表于2020-09-29 21:39 被阅读0次

核心思想:分治

第一种:挖坑法
C++:

// 挖坑法
int QuickSort::partitionV1(std::vector<int> &arrNumbers, int startIndex, int endIndex) {
    
    int key = arrNumbers[startIndex];
    int i = startIndex;
    int j = endIndex;
    while ( i < j ) {
        
        while ( i < j && arrNumbers[j] >= key ) {
            
            --j;
        }
        
        if ( i < j ) {
            
            arrNumbers[i] = arrNumbers[j];
        }
        
        while ( i < j && arrNumbers[i] <= key ) {
            
            ++i;
        }
        
        if ( i < j ) {
            
            arrNumbers[j] = arrNumbers[i];
        }
    }
    arrNumbers[i] = key;
    
    return i;
}


void QuickSort::sortV1(std::vector<int>& arrNumbers, int startIndex, int endIndex) {
    
    if ( endIndex <= startIndex ) {
        
        return;
    }
    
    int index = partitionV1( arrNumbers, startIndex, endIndex );
    sortV1( arrNumbers, startIndex, index - 1 );
    sortV1( arrNumbers, index + 1, endIndex );
}


void QuickSort::sortV1(std::vector<int>& arrNumbers) {
    
    sortV1( arrNumbers, 0, arrNumbers.size() - 1 );
}

Objective-C:

// 挖坑法
+ (NSInteger)partitionV1:(nonnull NSMutableArray<NSNumber *> *)arrMNumbers
              startIndex:(NSInteger)startIndex
                endIndex:(NSInteger)endIndex {
    
    
    NSNumber *key = arrMNumbers[startIndex];
    NSInteger i = startIndex;
    NSInteger j = endIndex;
    while ( i < j ) {
        
        while ( i < j && arrMNumbers[j].integerValue >= key.integerValue ) {
            
            --j;
        }
        
        if ( i < j ) {
            
            arrMNumbers[i] = arrMNumbers[j];
        }
        
        while ( i < j && arrMNumbers[i].integerValue <= key.integerValue ) {
            
            ++i;
        }
        
        if ( i < j ) {
            
            arrMNumbers[j] = arrMNumbers[i];
        }
    }
    arrMNumbers[i] = key;
    
    return i;
}


+ (void)quickSortV1:(nonnull NSMutableArray<NSNumber *> *)arrMNumbers
         startIndex:(NSInteger)startIndex
           endIndex:(NSInteger)endIndex {
    
    if ( endIndex <= startIndex ) {
        
        return;
    }
    
    NSInteger index = [self partitionV1:arrMNumbers
                             startIndex:startIndex
                               endIndex:endIndex];
    [self quickSortV1:arrMNumbers
           startIndex:startIndex
             endIndex:index - 1];
    [self quickSortV1:arrMNumbers
           startIndex:index + 1
             endIndex:endIndex];
}


+ (nullable NSArray<NSNumber *> *)quickSortV1:(nonnull NSArray<NSNumber *> *)arrNumbers {
    
    NSMutableArray<NSNumber *> *arrMNumbers = [arrNumbers mutableCopy];
    [self quickSortV1:arrMNumbers
           startIndex:0
             endIndex:arrMNumbers.count - 1];
    
    return [arrMNumbers copy];
}

第二种:指针交换法
C++:

// 指针交换法
int QuickSort::partitionV2(std::vector<int> &arrNumbers, int startIndex, int endIndex) {
    
    int i = startIndex;
    int j = endIndex;
    while ( i != j ) {
        
        while ( i < j && arrNumbers[j] >= arrNumbers[startIndex] ) {
            
            --j;
        }
        
        while ( i < j && arrNumbers[i] <= arrNumbers[startIndex] ) {
            
            ++i;
        }
        
        if ( i < j ) {
            
            // swap
            arrNumbers[i] = arrNumbers[i] ^ arrNumbers[j];
            arrNumbers[j] = arrNumbers[i] ^ arrNumbers[j];
            arrNumbers[i] = arrNumbers[i] ^ arrNumbers[j];
        }
    }
    if ( i != startIndex) {
        
        arrNumbers[i] = arrNumbers[i] ^ arrNumbers[startIndex];
        arrNumbers[startIndex] = arrNumbers[i] ^ arrNumbers[startIndex];
        arrNumbers[i] = arrNumbers[i] ^ arrNumbers[startIndex];
    }
    
    return i;
}


void QuickSort::sortV2(std::vector<int>& arrNumbers, int startIndex, int endIndex) {
    
    if ( endIndex <= startIndex ) {
        
        return;
    }
    
    int index = partitionV2( arrNumbers, startIndex, endIndex );
    sortV2( arrNumbers, startIndex, index - 1 );
    sortV2( arrNumbers, index + 1, endIndex );
}


void QuickSort::sortV2(std::vector<int>& arrNumbers) {
    
    sortV2(arrNumbers, 0, arrNumbers.size() - 1);
}

Objective-C:

// 指针交换法
+ (NSInteger)partitionV2:(nonnull NSMutableArray<NSNumber *> *)arrMNumbers
              startIndex:(NSInteger)startIndex
                endIndex:(NSInteger)endIndex {
    
    NSInteger i = startIndex;
    NSInteger j = endIndex;
    while ( i != j ) {
        
        while ( i < j && arrMNumbers[j].integerValue >= arrMNumbers[startIndex].integerValue ) {
            
            --j;
        }
        
        while ( i < j && arrMNumbers[i].integerValue <= arrMNumbers[startIndex].integerValue ) {
            
            ++i;
        }
        
        if ( i < j ) {
            
            NSNumber *temp = arrMNumbers[i];
            arrMNumbers[i] = arrMNumbers[j];
            arrMNumbers[j] = temp;
        }
    }
    NSNumber *temp = arrMNumbers[i];
    arrMNumbers[i] = arrMNumbers[startIndex];
    arrMNumbers[startIndex] = temp;
    
    return i;
}


+ (void)quickSortV2:(nonnull NSMutableArray<NSNumber *> *)arrMNumbers
         startIndex:(NSInteger)startIndex
           endIndex:(NSInteger)endIndex {
    
    if ( endIndex <= startIndex ) {
        
        return;
    }
    
    NSInteger index = [self partitionV2:arrMNumbers
                             startIndex:startIndex
                               endIndex:endIndex];
    [self quickSortV2:arrMNumbers
           startIndex:startIndex
             endIndex:index - 1];
    [self quickSortV2:arrMNumbers
           startIndex:index + 1
             endIndex:endIndex];
}


+ (nullable NSArray<NSNumber *> *)quickSortV2:(nonnull NSArray<NSNumber *> *)arrNumbers {
    
    NSMutableArray<NSNumber *> *arrMNumbers = [arrNumbers mutableCopy];
    [self quickSortV2:arrMNumbers
           startIndex:0
             endIndex:arrMNumbers.count - 1];
    
    return [arrMNumbers copy];
}

第三种:前后指针法
C++:

// 前后指针法
int QuickSort::partitionV3(std::vector<int> &arrNumbers, int startIndex, int endIndex) {
    
    int cur = startIndex;
    int pre = cur - 1;
    while ( cur <= endIndex ) {
        
        while ( cur <= endIndex && arrNumbers[cur] <= arrNumbers[startIndex] ) {
            
            ++cur;
            pre = cur - 1;
        }
        
        while ( cur <= endIndex && arrNumbers[cur] >= arrNumbers[startIndex] ) {
            
            ++cur;
        }
        
        if ( cur <= endIndex && pre + 1 < cur ) {
            
            std::swap( arrNumbers[pre + 1], arrNumbers[cur] );
            pre = pre + 1;
            cur = pre + 1;
        }
    }
    if ( pre <= endIndex && pre != startIndex ) {
        
        std::swap( arrNumbers[pre], arrNumbers[startIndex] );
    }
    
    return pre;
}


void QuickSort::sortV3(std::vector<int>& arrNumbers, int startIndex, int endIndex) {
    
    if ( endIndex <= startIndex ) {
        
        return;
    }
    
    int index = partitionV3( arrNumbers, startIndex, endIndex );
    sortV3( arrNumbers, startIndex, index - 1 );
    sortV3( arrNumbers, index + 1, endIndex );
}


void QuickSort::sortV3(std::vector<int>& arrNumbers) {
    
    sortV3(arrNumbers, 0, arrNumbers.size() - 1);
}

Objective-C:

// 前后指针法
+ (NSInteger)partitionV3:(nonnull NSMutableArray<NSNumber *> *)arrMNumbers
              startIndex:(NSInteger)startIndex
                endIndex:(NSInteger)endIndex {
    
    NSInteger cur = startIndex;
    NSInteger pre = cur - 1;
    while ( cur <= endIndex && pre <= endIndex ) {

        while ( cur <= endIndex && arrMNumbers[cur].integerValue <= arrMNumbers[startIndex].integerValue ) {

            ++cur;
            pre = cur - 1;
        }

        while ( cur <= endIndex && arrMNumbers[cur].integerValue >= arrMNumbers[startIndex].integerValue ) {

            ++cur;
        }

        if ( cur <= endIndex && pre + 1 <= endIndex && pre + 1 < cur ) {

            NSNumber *temp = arrMNumbers[cur];
            arrMNumbers[cur] = arrMNumbers[pre + 1];
            arrMNumbers[pre + 1] = temp;

            pre = pre + 1;
            cur = pre + 1;
        }
    }
    if ( pre != startIndex && pre <= endIndex ) {

        NSNumber *temp = arrMNumbers[pre];
        arrMNumbers[pre] = arrMNumbers[startIndex];
        arrMNumbers[startIndex] = temp;
    }
    
    return pre;
}


+ (void)quickSortV3:(nonnull NSMutableArray<NSNumber *> *)arrMNumbers
         startIndex:(NSInteger)startIndex
           endIndex:(NSInteger)endIndex {
    
    if ( endIndex <= startIndex ) {
        
        return;
    }
    
    NSInteger index = [self partitionV3:arrMNumbers
                             startIndex:startIndex
                               endIndex:endIndex];
    if ( index == -1 ) {
        
        return;
    }
    [self quickSortV3:arrMNumbers
           startIndex:startIndex
             endIndex:index - 1];
    [self quickSortV3:arrMNumbers
           startIndex:index + 1
             endIndex:endIndex];
}


+ (nullable NSArray<NSNumber *> *)quickSortV3:(nonnull NSArray<NSNumber *> *)arrNumbers {
    
    NSMutableArray<NSNumber *> *arrMNumbers = [arrNumbers mutableCopy];
    [self quickSortV3:arrMNumbers
           startIndex:0
             endIndex:arrMNumbers.count - 1];
    
    return [arrMNumbers copy];
}

DEMO

相关文章

  • 算法❤ 八大排序算法

    八大排序法【内部排序】:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序 【插入排序】...

  • 八大排序算法

    八大排序:一、直接插入排序 二、希尔排序 三、简单选择排序 四、堆排序 五、冒泡排序 六、快速排序 七、归并排序 ...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 2020-04-30-排序算法

    冒泡排序 直接选择排序 插入排序 快速排序 参考 算法学习笔记17-经典排序算法八大排序算法稳定性分析

  • 1.2-交换排序-快速排序

    参考链接 交换排序:快速排序(Quick Sort) 白话经典算法系列之六 快速排序 快速搞定 快速排序是C.R....

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • 排序算法

    常见排序算法比较 参考资料:各种排序算法比较 参考资料:快速排序算法 必须知道的八大种排序算法【java实现】(一...

  • 排序算法之插入排序和希尔排序(shell sort)

    插入排序(inserction sort)和希尔排序(shell sort) 相关文章 排序算法之快速排序

  • 2018-07-03

    排序算法之快速排序 快速排序算法由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加...

网友评论

      本文标题:八大排序之快速排序

      本文链接:https://www.haomeiwen.com/subject/ftryuktx.html