C语言快速排序及其优化操作

快速排序原理简述:找到每一轮最大(最小)的数, 依次从左到右存入新的数组,就完成了降序(升序)的排列。

#include <stdio.h>
int main(void) {
    int n;
    scanf("%d", &n);
    int a[n], temp;
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    for (int i = 0; i < n - 1; i++) {  
//把前面n-1个数拿出来进行排序,最后一个数自然就是最小的了,所以是 i < n - 1 
        for (int j = i + 1; j < n; j++ ) { 
//把上面拿出来的一个数轮流与他后面的数进行比大小 
            if (a[i] < a[j]) {            
  // 如果后面有一个数比他大,则进行交换,始终保持大的数在前面,找出这一轮次下最大的值。 
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    
    for (int i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    return 0;
}

外层循环 按数组下标顺序排列,内层循环 依次给数组下标分配每一轮最大的值 (第一轮是最大的值,由于第一轮最大的值给了下标为0的数组,所以第二轮找到的最大值其实是整个里面第二大的值,第三轮找到的也就是第三大的值。这样就能降序排列了。

优化部分代码如下:

int k;//引入变量k,记录内层循环每一轮找到最大值即其对应的数组下标
    for (int i = 0; i < n - 1; i++) {  
        k = i;
        for (int j = i + 1; j < n; j++ ) { 
            if (a[k] < a[j]) {              
                k = j;
            }
        }
        temp = a[i];
        a[i] = a[k];//把最大值依次从左向右传入
        a[k] = temp;
    }

减少了交换

posted @ 2023-07-27 21:11  GooseY  阅读(174)  评论(0)    收藏  举报