从文件 C++ 导入和插入排序

import from file c++ & insertion sort

本文关键字:插入排序 导入 C++ 文件      更新时间:2023-10-16

我正在做一个需要这样做的项目:

在C++中,创建一个类,它是一个双链接的整数列表。

此类应具有以下内容:-正常插入功能(push_back、push_front)-正常删除功能(pop_back、pop_front)-3排序功能-插入排序-合并排序-气泡排序

排序方法应打印出处理时间(最短为微米或毫秒)和使用的排序(例如,在气泡排序完成后,气泡排序-100ms)。

创建一个程序,从文件中读取一堆数字,并创建您的链表(每次运行创建三个列表)。然后,程序应该按照每个方法进行排序。显示三次跑步的结果,一次包含100000个数字,一次显示10000个数字,另一次显示1000个数字。

我一直在尝试导入我的第一个文件(file1.txt),它有100000个整数,并将它们保存到我的双链接列表中。任何关于如何做到这一点的建议都将是非常棒的。接下来,我将尝试研究插入排序算法,到目前为止,我所拥有的是数组的插入排序,而不是双链表。如果你能扫描我的代码,给我任何建议,那就太好了。我从来没有用C++编写过代码,只用java编写过,这项任务对我来说很有挑战性!

#include<iostream>
//for time elapsed
#include <chrono>
using namespace std;
template <class T>
class doublylinkedlist
{
private :
    struct node
    {
        T data;
        node *prev;
        node *next;
    };
    node *head;
    node *tail;
public :
    doublylinkedlist()
    {
        head=tail=NULL;
    }
    void createlist(T[] , int);
    void pushfirst(T);
    void pushlast(T);
    void pushafter(T,T);
    void pop(T);
    void displayforward();
    void displaybackward();
};
//creating doubly linked list
template<class T>
void doublylinkedlist<T>::createlist(T x[], int n) //n = size 
{
    node *q;
    node *p=new node;   //create first node
    p->data=x[0];
    p->next=NULL;
    p->prev=NULL;
    for(int i=1;i<n;i++)
    {
        q=p;               
        p=p->next=new node;
        p->data=x[i];
        p->next=NULL;
        p->prev=q;
    }
    tail=p;
}
// Inserting new node at start of doubly linked list
template<class T>
void doublylinkedlist<T>::pushfirst(T item)
{
    node *p=new node;
    p->data=item;
    p->prev=NULL;
    head->prev=p;
}
//Inserting new node at last of Double Linkedlist
template<class T>
void doublylinkedlist<T>::pushlast(T item)
{
    node *p=new node;
    p->data=item;
    p->prev=tail;
    p->next=NULL;
    tail=p;
}
//deleting item from double linked list
template<class T>
void doublylinkedlist<T>::pop(T item)
{
    if(head==NULL)
    {
        cout<<"This list is empty!"<<endl;
        return;
    }
    if(head->data==item)
    {
        head=head->next;
        head->prev=NULL;
        return;
    }
    if(tail->data==item)
    {
        tail=tail->prev;
        tail->next=NULL;
        return;
    }
    node *p=head->next;
    while(p!=NULL)
    {
        if(p->data==item)
            break;
        p=p->next;
    }
    if(p==NULL)
    {
        cout<<item<<"not found "<<endl;
        return;
    }
    (p->prev)->next=p->next;
    (p->next)->prev=p->prev;
    return;
}
//displaying list elements in forward direction
template<class T>
void doublylinkedlist<T>::displayforward()
{
    node *p=head;
    cout<<"n Doubly linked list (Forward)";
    while(p!=NULL)
    {
        cout<<p->data<<"";
        p=p->next;
    }
}
//displaying list elements in reverse direction
template<class T>
void doublylinkedlist<T>::displaybackward()
{
    node *p=tail;
    cout<<"n Doubly linked list (Backward)";
    while(p!=NULL)
    {
        cout<<p->data<<"";
        p=p->prev;
    }
}
//insertion sort function
void doublylinkedlist<T>::insertionSort(T x[], int n) 
{
 auto beg = std::chrono::high_resolution_clock::now();
    int i, j ,tmp;
    for (i = 1; i < n; i++) 
    {
       j = i;
       while (j > 0 && x[j - 1] > x[j]) 
       {
       tmp = x[j];
       x[j] = x[j - 1];
       x[j - 1] = tmp;
       j--;
       }
    printArray(x,5);
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - beg).count() << std::endl;
    std::cin.get();
    return 0;
}

int main()
{
  ifstream myfile ("file1.txt");
  if (myfile.is_open())
  {
    //i need to insert the file into the doubly linked list here.
    //file.txt is has 100000 integers 
    doublylinkedlist<int> firstList;
    myfile.close();
  }
  else cout << "Unable to open file"; 
  return 0;
    //replace this with input from file
    //10000 numbers
    doublylinkedlist<int> secondList;
    //1000 numbers 
    doublylinkedlist<int> thirdList;
    //example of what to run 
    firstList.createlist(x,2);
    firstList.pushfirst(22);
    firstList.pushlast(55);
    firstList.pushafter(66,33);
    firstList.pop(22);
    firstList.pop(55);
    firstList.pop(66);
    return 0;
}

成功打开文件后,您需要添加一个循环执行:

read a number from the file into temp variable
firstList.pushlast(temp)

关于排序,我相信您应该移动列表中的节点(而不是像在数组中那样在节点之间复制值)以使列表排序。