非递减数组平方排序

35 阅读1分钟

题目:

给你一个按非递减顺序(即递增) 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

代码:

#include <iostream>
#include <cmath>

using namespace std;

//采用类归并排序的思想,找到负数和非负数分界位置,由中间向两侧遍历,使用一个辅助数组将平方值存入
void square_sort (int a[], int n){
    int B[n];               //辅助数组
    memcpy(B,a,n*sizeof(int));
    int i , j , k;          //k记录非负数开始的数组下标,i记录最后一个负数的数组下标
    for(k = 0; k < n; k++ ){
        if(a[k] >= 0){
            i = k - 1;
            break;
        }//if
    }//for
    while( i>=0 && k<n ){
        //由中间向两边遍历
        if( abs(B[i]) <= B[k] )     a[j++] = B[i]*B[i--];
        else    a[j++] = B[k]*B[k++];
    }//for
    while(i>=0) a[j++] = B[i]*B[i--];
    while(k<n)  a[j++] = B[k]*B[k++];//只会执行一个
}
//打印函数
void printout(int s[], int num){
    for(int i = 0; i < num; i++) {
        cout << s[i] << " ";
    }//for
    cout <<endl;
}

int main() {
    int s[] = {-4,-2,1,3,6,9,12};//给定非递增数组
    cout << "Before sort: " <<endl;
    printout(s,7);      //打印对照组
    square_sort(s,7);
    cout << "After sort: " <<endl;
    printout(s,7);      //打印排序后数组
    return 0;
}