插入排序
//需要注意的是传入的是二级指针,这样才会对链表内容进行修改。
#pragma once
#include<iostream>
using namespace std;
struct Node
{
int data;
Node *next;
Node(int x) { data = x;next = NULL; }
};
void insert_operation(Node **head, Node *p)//插入操作
{
if (p->data < (*head)->data)//要插入链表的最开始处
{
p->next = *head;
*head = p;
return ;
}
Node *cur = *head;
Node *prev;
while (cur)
{
if (p->data < cur->data)
break;
prev = cur;
cur = cur->next;
}
p->next = prev->next;//就是cur
prev->next = p;
return ;
}
void insert_sort(Node **head)
{
if (head == NULL || (*head) == NULL)
return ;
Node *cur = (*head)->next;
(*head)->next = NULL;
Node *prev=cur;
while (cur)
{
prev = cur;
cur = cur->next;//必须先把cur指向下一个,因为insert_operation会对prev->next进行操作,所以在操作之前对其修改
insert_operation(head, prev);
}
return ;
}
#include<iostream>
using namespace std;
#include"链表排序.h"
int main()
{
Node *head = new Node(3);
Node *p = new Node(NULL);
p = head;
p->next = new Node(2);p = p->next;
p->next = new Node(1);p = p->next;
p->next = new Node(5);p = p->next;
p->next = new Node(4);
p = head;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
Node **h = &head;
insert_sort(h);
p = head;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
关于链表排序是否适合
(1)插入排序 (适合)
(2)冒泡排序 (适合)
(3)希尔排序 (适合)
(4)选择排序 (适合)
(5)快速排序 (不适合)
(6)合并排序 (不适合)
(7)基数排序 (不适合)
(8)堆排序 (不适合)
new一个一位数组二维数组
C++中引入了new运算符,用于动态地申请空间。现简单解析其用法。
一、创建单个元素
(1) char * p = new char;
这种方式申明了一个指向一个字符空间的指针变量;然而,这个字符空间中存储什么内容这条语句并没有给出,即没有给这个字符空间初始化。
(2)char * p = new char();
这种方式先申明了一个指向一个字符空间的指针变量;并且调用构造函数为这个字符空间赋初值null;
二、创建一维数组
(1)char * p = new char[3];
这种方式创建了一个指向字符串首地址的指针变量;没有对字符串初始化;
(2)char * p = new char3;
创建了一个指向字符串首地址的指针变量;并对字符串初始化;
三、创建一个二维数组
(1) char *p = new char[3];
for(int i = 0;i < 3;i++)
{
p[i] = new char[5];
}
这是大家使用比较多的一种方法。先创建一个指向字符指针数组的指针变量,然后,指针数组中的每个元素,让其指向一个字符数组;
(2) char (*p) [5] = new char[3][5];
这种方法使用比较简洁。将char[5]看作一种数据类型,先创建一个指向由char[5]构成的数组的首地址的指针变量,然后,这个由char[5]构成的数组共有3个元素。
事实上,在Java中,char[] 就是一种数据类型,这是一种面向对象思想的体现。