快速排序原理简述:找到每一轮最大(最小)的数, 依次从左到右存入新的数组,就完成了降序(升序)的排列。
#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; }
减少了交换
标签:下标,temp,int,C语言,++,数组,排序,优化 From: https://www.cnblogs.com/doubleriozyt/p/17586083.html