快速排序(OC和C语言)

2020-10-23  本文已影响0人  Queen_BJ

通俗易懂的快速排序

原理分析(从小到大):
  1. 首先取出一个key,一般取第一个元素
  2. 从后往前遍历,如果数组中的数据小于了key,那么就将从前往后未比较过的第一个位置即fisrt位置替换为该数据
  3. 然后从前往后遍历,如果数组中的数据大于了key,那么就将从后往前的第一个比较过数据位置替换
  4. 直到左右两边的位置重合,说明key就找到了正确的位置,每次循环就能找到一个数的正确位置
  5. 然后将key左右两边的数据分为两组,递归调用自己。

OC语言


- (void)viewDidLoad {
    [super viewDidLoad];

   NSLog(@"快速%@",[self quickSortWithArray:mutArr.copy]);
}

- (NSArray *)quickSortWithArray:(NSArray *)array {
    if (!array) {
        return @[];
    }
    if (array.count == 0 || array.count == 1) {
        return array;
    }
   
    NSInteger baseNumberIndex = random() % array.count;
    NSLog(@"基准数是%ld",baseNumberIndex);
    
    NSNumber *baseNumber = array[baseNumberIndex];
    NSMutableArray *unsortedArray = [array mutableCopy];
    // 移除基准数
    [unsortedArray removeObjectAtIndex:baseNumberIndex];
    NSMutableArray *leftArray = [NSMutableArray array];
    NSMutableArray *rightArray = [NSMutableArray array];
    
    for (NSNumber *curNumber in unsortedArray) {
        if (curNumber.integerValue < baseNumber.integerValue) {
            [leftArray addObject:curNumber];
        } else {
            [rightArray addObject:curNumber];
        }
    }
    
    NSMutableArray *sortedArray = [NSMutableArray array];
    [sortedArray addObjectsFromArray:[self quickSortWithArray:[leftArray copy]]];
    [sortedArray addObject:baseNumber];
    [sortedArray addObjectsFromArray:[self quickSortWithArray:[rightArray copy]]];
    
    return sortedArray;
    
}

 快速(
    1,
    7,
    10,
    15,
    37,
    90
)

C语言

#include <stdio.h>
void quickSort(int arr[], int low, int high);

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    
    int i;
    int a[10] = {3, 1, 11, 5, 8, 2, 0, 9, 13, 81};

    for(i = 0; i < 10; i++)
        printf("%d ", a[i]);
    printf("\n");

    quickSort(a, 0, 9);

    for(i = 0; i < 10; i++)
    printf("%d ", a[i]);
    printf("\n");
 
    return 0;
}

void quickSort(int arr[], int low, int high)
{
    int first = low;
    int last  = high;
    int key = arr[first];
    if(low >= high)
        return;
    while(first < last)
    {
        while(first < last && arr[last] > key)
        {
            last--;
        }
        arr[first] = arr[last];

        while(first < last && arr[first] < key)
        {
            first++;
        }
        arr[last] = arr[first];
    }
   //  直到first=last,说明这个位置是基准数据的正确索引位置
    arr[first] = key;

    quickSort(arr, low, first-1);
    quickSort(arr, first+1, high);
}

Hello, World!
3 1 11 5 8 2 0 9 13 81 
0 1 2 3 5 8 9 11 13 81 

参考一

参考二

上一篇 下一篇

猜你喜欢

热点阅读