通过冒泡排序、选择排序和插入排序三种排序方法进行排序C++

如何利用随机数生成函数,产生待排序序列,序列长度可任意指定。
如何设计CSort类 ,完成冒泡排序、选择排序和插入排序三种排序方法设计。
输出并比较三种方法

任意一种?那么显然冒泡比较简单
我帮你写一个,你参考参考

#include <iostream>
#include <cstdlib>
#include <ctime>

class CSort {
public:
    CSort(int length) {
        arrLength = length;
        arr = new int[arrLength];
    }
    ~CSort() {
        delete[] arr;
    }
    void GenerateRandomArray() {
        srand(time(0)); 
        for (int i = 0; i < arrLength; i++) {
            arr[i] = rand() % 100; 
        }
    }

    void BubbleSort() {
        for (int i = 0; i < arrLength - 1; i++) {
            for (int j = 0; j < arrLength - 1 - i; j++) {
                if (arr[j] > arr[j+1]) {
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }

    void PrintArray() {
        for (int i = 0; i < arrLength; i++) {
            std::cout << arr[i] << " ";
        }
        std::cout << std::endl;
    }

private:
    int* arr;
    int arrLength;
};
int main() {
    CSort sortObj(10);
    sortObj.GenerateRandomArray();
    std::cout << "生成的随机数序列: ";
    sortObj.PrintArray();
    sortObj.BubbleSort();
    std::cout << "排序以后: ";
    sortObj.PrintArray();
    return 0;
}


  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:【C++数据结构实验】基于双端队列的头插、头删操作,完成栈的应用:逆波兰表达式求值,测试和调试程序。
  • 除此之外, 这篇博客: 数据结构272-哈夫曼树求字符频度中的 也可使用c++的最小堆实现优先级队列实现此算法,效率较高,由于不想使用c++,就自己实现了有序链表来完成此题 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include<stdio.h>
    #include<stdlib.h>
    typedef struct node{
    	int data;
    	struct node *next;
    }Linklist;
    //创建链表 
    Linklist* create(int array[],int n){
    	int i;
    	Linklist *head,*p,*q;
    	head=(Linklist *)malloc(sizeof(Linklist));
    	head->next=p=q=NULL;
    	for(i=0;i<n;i++){
    		q=(Linklist *)malloc(sizeof(Linklist));
    		q->data=array[i];
    		q->next=NULL;
    		if(head->next==NULL){
    			head->next=q;
    			p=q;
    		}else{
    			p->next=q;
    			p=q;
    		}
    	}
    	return head;
    }
    //将数字有序插入 
    Linklist * insert(Linklist *head,int num){
    	Linklist *p,*q;
    	q=(Linklist *)malloc(sizeof(Linklist));
    	q->data=num;
    	q->next=NULL;
    	p=head;
    	if(head->next==NULL){//最后一次为空还需要插入值 
    		head->next=q; 
    	}else{
    		while(p->next!=NULL&&num>p->next->data){
    			p=p->next;
    		}
    		q->next=p->next;
    		p->next=q;
    	}
    	return head;
    }
    //删除头元素 
    Linklist *delHead(Linklist *head){
    	Linklist *p;
    	p=head->next;
    	head->next=p->next;
    	free(p);
    	return head;
    }
    int main(void){
    	int n,i,j,temp;
    	int array[1000];
    	int sum,sum1,sum2,count;
    	scanf("%d",&n);
    	for(i=0;i<n;i++){
    		scanf("%d",&array[i]);
    	}
    	//给数组排序 
    	for(i=1;i<n;i++){
    		for(j=i;j>0;j--){
    			if(array[j]<array[j-1]){
    				temp=array[j];
    				array[j]=array[j-1];
    				array[j-1]=temp;
    			} 
    		}
    	}
    	//创建链表 
    	Linklist *head=create(array,n);
    	Linklist *p;
    	//计算频度
    	count=0;
    	while(head->next->next!=NULL){
    		sum1=head->next->data;
    		head=delHead(head);
    		sum2=head->next->data;
    		head=delHead(head);
    		sum=sum1+sum2;
    		count+=sum;
    		head=insert(head,sum);
    	}
    	printf("%d",count);
    	return 0;
    }