C++把数字排序

C++把数字排序

描述

如题,详细如下:
输入不超过1024个数字,以特殊数字结尾,如(-999),把数字从小到大排序。

思路

目前,我们有两种思路可以写:

1是 在输入的时候,排序数组。
2是 先输入到数组,再排序。

其中,笔者认为第一种更简单,故此,本章采取第一种思路。

代码

#include <iostream>
using namespace std;//命名空间
int main()
{
    int num[1024] = {};//总数字数组
    int temp;//输入变量
    int count=0;//输入到数组位置
    int pos;//比数小的位置
    while (1) {
        pos = -999;//不存在的位置
        cin >> temp;//输入
        if (temp == -999) break;//如果输入-999就结束
        if (count != 0) {//如果当前不是第一位
            for (int i = count; i >=  0; i--) {
                if (temp <= num[i]) {//如果有比这个数小的
                    pos = i;
                }
            }
            if (pos == -999) {//当全部数组里面没有比这个数小的
                num[count] = temp;//移到最后一位
            }
            else {
                for (int x = count; x >= pos; x--) {//全部后移
                    num[x + 1] = num[x];
                }
                num[pos] = temp;//存储到后移的空位
            }
        }
        else {
            num[count] = temp;//第一位
        }
        count++;//位置+1
    }
   for (int i = 0; i < count; i++) {
       cout << num[i]<<" ";//依次输出
   }
   return 0;
}

不过这套算法的时间复杂为O(n^2) 最简单的quick sort为O(n*logn) 所以从最简上看,还是应该用quick sort
解法2

#include <iostream>
using namespace std;

struct Num{
	int num = 0;
	Num* next = NULL;
	Num* last = NULL;
	bool S = false;
	bool E = false;
}n[1024];
int main() {
	int i = 2;
	Num* END = &n[1];
	Num* START = &n[0];
	START->S = true;
	START->next = &n[2];
	END->E = true;
	END->last = &n[2];
	n[2].last = START;
	n[2].next = END;
	
	int temp;
	while (true) {
		temp = 0;
		cin >> temp;
		if (temp == -999) break;
		n[i].num = temp;
		if(i!=2) {
			Num* s = START->next;
			bool flag = false;
			while (1) {
				if (s->E) {
					break;
				}
				else if (s->num <= temp&&s->next->num>=temp) {
					Num* b = s->next;
					Num* l = s->next->last;
					b->last = &n[i];
					n[i].next = b;
					l->next = &n[i];
					n[i].last = l;
					flag = true;
					break;
				}
				s = s->next;
			}
			if (!flag) {
				if (temp < START->next->num) {
					n[i].next = START->next;
					n[i].last = START;
					START->next->last = &n[i];
					START->next = &n[i];
				}
				if (temp >= END->last->num) {
					END->last->next = &n[i];
					END->last = &n[i];
					n[i].last = END->last;
					n[i].next = END;
				}
			}
			
		}
		i++;
	}
	Num* out = START;
	for (int a = 0; a < i; a++) {
		out = out->next;
		if (out->E)break;
		cout << out->num << " ";
	}
	return 0;
}
End
posted @ 2020-04-15 09:29  Eritque-arcus  阅读(838)  评论(0)    收藏  举报