采用指针,在遍历同时消除重复,不单独安排冗余消除循环
#include <stdio.h> #include <stdlib.h> int sortArr(int total,int* arr){ int* p=NULL; p=arr; for(int i=0;i<total;i++){ scanf("%i",p); p++; } int* pNoRptPos=arr; int* rear=&arr[total-1]; int* itor=arr; int* pCurMin=0; int postMin=0,swapTmp; //example 8( 5 4 3 3 2 4 1 2) // *1 4 3 3 2 4 5 2 // 1 *2 3 3 4 4 5 2 // 1 2 *3 3 4 4 5 2 // 1 2 3 *4 3 4 5 2 // 1 2 3 4 *5 4 3 2 // less than 5, then no swap any more while(pNoRptPos!=rear){ //make sure at least 2 element pCurMin=pNoRptPos; itor=pNoRptPos; do{ itor++; // if(*pCurMin<=postMin && *itor>postMin){ pCurMin=itor; continue; }else if(*itor<*pCurMin && *itor>postMin){ pCurMin=itor; } }while(itor!=rear);//find the min element in current round scan //swap if(pCurMin != pNoRptPos && *pCurMin > postMin){ //puts("swapped"); swapTmp=*pCurMin; *pCurMin=*pNoRptPos; *pNoRptPos=swapTmp; } if(*pNoRptPos>postMin){//postmin no change after 5 is confirmed postMin=*pNoRptPos; } pNoRptPos++; } return 0; } int main(void){ int total=0; int* arr=NULL; int round=0; while(scanf("%i",&total) && round<2){ arr=(int *)malloc( total * sizeof(int) ); sortArr(total,arr); int post=0; for(int i=0;i<total;i++){ if(arr[i]>post){ printf("%i\n",arr[i]); post=arr[i]; } } round++; } return 0; }