ListNode *insertionSortList(ListNode *head) {
		ListNode dummy(INT_MIN);
		for (ListNode *cur = head; cur != nullptr;) {
			auto pos = findInsertPos(&dummy, cur->val);
			ListNode *tmp = cur->next;
			cur->next = pos->next;
			pos->next = cur;
			cur = tmp;
		}
		return dummy.next;
	}
예제 #2
0
int planEmptyTS(
	unsigned int TSNumPerLine,
	unsigned int protectTSNum,
	unsigned int leastEmptyTSNum, 
	unsigned int inNum, 
	P_PLAN_INPUT_UNIT pIn, 
	P_PLAN_OUTPUT_UNIT pOut) {

	//unsigned char extraTSNum[inNum];
	unsigned char *cycleNum = NULL;
	unsigned char **perCycleEmptyTSNum = NULL;

	//unsigned int curInsertNum = 0;
	unsigned char *insertPos = NULL;

	unsigned int i = 0, j = 0, k = 0, startPos = 0, endPos = 0, epmtyTSNum = 255, tempEptTSNum = 255;

	int tempVal = 0;

	if((2*protectTSNum) >= TSNumPerLine) 
		return -1;

	cycleNum = (unsigned char *)malloc(inNum);

	perCycleEmptyTSNum = (unsigned char **)malloc(inNum*sizeof(char *));
	for(i=0; i<inNum; i++) {
		perCycleEmptyTSNum[i] = (unsigned char *)malloc(TSNumPerLine);
	}

	insertPos = (unsigned char *)malloc(leastEmptyTSNum);

	for(i=0; i<inNum; i++) {
		pOut[i].emptyTSNum = TSNumPerLine % pIn[i].totalTTSNum;
		cycleNum[i] = TSNumPerLine / pIn[i].totalTTSNum;
		if(0 == pOut[i].emptyTSNum) {
			pOut[i].emptyTSNum += pIn[i].totalTTSNum;
			cycleNum[i] --;
		}
		disperseEmptyTS(pOut[i].emptyTSNum, cycleNum[i], perCycleEmptyTSNum[i]);
		expressionEmptyTS(pIn[i].totalTTSNum, cycleNum[i], perCycleEmptyTSNum[i], pOut[i].emptyTSPos);
		memset(pOut[i].emptyTSAttr, EMPTY_TS_ATTR_ASYNC, pOut[i].emptyTSNum);
	}



PLAN_EMPTY_TS :

	memset(insertPos, TSNumPerLine-2, leastEmptyTSNum);
	for(i=0; i<leastEmptyTSNum; i++) {

		sort(i, insertPos);
		epmtyTSNum = 255;
		tempEptTSNum = 255;
		tempVal = 0;
		for(j=0; j<i+1; j++) {
			if(0 == j)
				startPos = 0;
			else
				startPos = insertPos[j-1];

			endPos = insertPos[j];

			tempVal = findInsertPos(startPos, endPos, inNum, pIn, pOut, &tempEptTSNum);
			if(tempVal > 0) {
				if(tempEptTSNum < epmtyTSNum) {
					epmtyTSNum = tempEptTSNum;
					insertPos[i] = tempVal;
				}
			} else {
				if(abs(tempVal) >= inNum) {
					//return -1;
					continue;
				}
				else {
					pOut[abs(tempVal)].emptyTSNum += pIn[abs(tempVal)].totalTTSNum;
					cycleNum[abs(tempVal)] --;
					for(k=0; k<inNum; k++) {
						disperseEmptyTS(pOut[k].emptyTSNum, cycleNum[k], perCycleEmptyTSNum[k]);
						expressionEmptyTS(pIn[k].totalTTSNum, cycleNum[k], perCycleEmptyTSNum[k], pOut[k].emptyTSPos);
						memset(pOut[k].emptyTSAttr, EMPTY_TS_ATTR_ASYNC, pOut[k].emptyTSNum);
						goto PLAN_EMPTY_TS;
					}
				}
			}
		}

		for(k=0; k<i; k++) {
			if(insertPos[k] > insertPos[i]) {
				endPos = insertPos[k];
				break;
			} else {
				endPos = (TSNumPerLine-protectTSNum);
			}
		}

		for(k=0; k<inNum; k++) {
			setSyncEmptyTSPos(insertPos[i], endPos, &pIn[k], pOut[k].emptyTSNum, pOut[k].emptyTSPos);
		}
	}

	
	for(i=0; i<inNum; i++) {
		for(j=0; j<TSNumPerLine; j++) {
			for(k=0; k<pOut[i].emptyTSNum; k++) {
				if(j == pOut[i].emptyTSPos[k])
					break;
			}
			if(k == pOut[i].emptyTSNum)
				printf("0 ");
			else 
				printf("1 ");
		}
		printf("\r\n");
	}



	free(cycleNum);

	for(i=0; i<inNum; i++) {
		free(perCycleEmptyTSNum[i]);
	}
	free(perCycleEmptyTSNum);

	free(insertPos);

	return 0;
}