采用指针,在遍历同时消除重复,不单独安排冗余消除循环
#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;
}


京公网安备 11010502036488号