题目:试着设计一个在时间上高效的算法,使得单链表A中的元素递减有序。
思想:
一般的方法是将单链表直接进行比较,进而实现该算法,但其实这样做并不高效,时间复杂度为O(n^2),我们可以将要存放在单链表中的数据线用一种较为高效的算法进行排序,进而再采用头插法插入单链表中,这样时间复杂度会更好一些。
代码展示:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/*
* 题目:试着设计一个在时间上高效的算法,使得单链表A中的元素递减有序。
* */
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LinkNode,*LinkList;
void InitLinkList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LinkNode));
L->next = NULL;
}
void InsertLinkList(LinkList &L,int x)
{
LinkList p;
p = (LinkList)malloc(sizeof(LinkNode));
p->data = x;
p->next = L->next;
L->next = p;
}
void Print(LinkList L)
{
printf("单链表中的元素为:");
while(L->next!=NULL)
{
printf("%d ",L->next->data);
L = L->next;
}
printf("\n");
}
//将元素从小到大排列的快速排序法,时间复杂度为:nlog2n
void quick_sort(int *p,int left,int right){
if(left<right){
int i = left;
int j = right;
int x = *(p+i);
while(i<j){
while(i<j && *(p+j)>=x){
j--;
}
if(i<j){
*(p+i) = *(p+j);
i++;
}
while(i<j && *(p+i)<x){
i++;
}
if(i<j){
*(p+j) = *(p+i);
j--;
}
*(p+i) = x;
quick_sort(p,left,i-1);
quick_sort(p,i+1,right);
}
}
}
int main() {
LinkList L;
InitLinkList(L);
int n;
printf("请输入要输入的元素个数:");
scanf("%d",&n);
int arr[n];
printf("请输入要输入的元素:");
for(int i=0; i<n; i++)
{
scanf("%d",&arr[i]);
}
quick_sort(arr,0,n-1);
for(int j=0; j<n; j++)
{
InsertLinkList(L,arr[j]);
}
printf("处理后单链表中元素递减,");
Print(L);
return 0;
}