링크 된 목록 및 배열에 대한 빠른 정렬 알고리즘 구현을 요구하는 알고리즘 문제가있었습니다.
나는 두 부분을 다했는데 알고리즘은 작동하지만 내 빠른 정렬 링크 목록 구현에 버그가있는 것 같습니다.왜 링크 된 목록의 빠른 정렬은 배열 1보다 훨씬 느립니다?
내 빠른 정렬 링크 목록 구현입니다.
public static void SortLinkedList(DataList items, DataList.Node low, DataList.Node high)
{
if(low != null && low !=high)
{
DataList.Node p = _PartitionLinkedList(items, low, high);
SortLinkedList(items, low, p);
SortLinkedList(items, p.Next(), null);
}
}
private static DataList.Node _PartitionLinkedList(DataList items, DataList.Node low, DataList.Node high)
{
DataList.Node pivot = low;
DataList.Node i = low;
for (DataList.Node j = i.Next(); j != high; j=j.Next())
{
if (j.Value().CompareTo(pivot.Value()) <= 0)
{
items.Swap(i.Next(),j);
i = i.Next();
}
}
items.Swap(pivot, i);
return i;
}
여기
public static void SortData(DataArray items, int low, int high)
{
if (low < high)
{
int pi = _PartitionData(items, low, high);
SortData(items, low, pi - 1);
SortData(items, pi + 1, high);
}
}
static int _PartitionData(DataArray arr, int low, int high)
{
double pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++)
{
if (arr[j].CompareTo(pivot)<=0)
{
i++;
arr.Swap(i,j);
}
}
arr.Swap(i + 1, high);
return i + 1;
}
여기 빠른 정렬 배열과 연결리스트의 성능입니다 빠른 정렬 배열의 구현을합니다. (left n, right time)
Picture
qs linked list에서 알 수 있듯이 6400 개의 요소를 정렬하는 데 10 분이 걸렸습니다. 그 정상적인 것 같아 ..
또한 데이터 구조 때문에 내가 생각하기 때문에 내가 선택한 정렬 및 성능에 대한 동일한 구조를 사용했기 때문에 링크 된 목록과 배열에 대한 유사했다.
GitHub repo 일부 코드를 제공하는 것을 잊어 버린 경우를 대비하여. Repo
링크 된 목록 구현이 더 느립니다. 왜냐하면 ... 배열 및 Big-O 표기법의 링크 된 목록에 대한 무작위 요소 액세스 시간은 얼마입니까? "링크 된 목록과 배열 모두에 대한 성능은 비슷했습니다."- 이것이 불가능할 수 있으므로 걱정스러운 표시가되어야합니다. 어쨌든 - 코드를 프로파일하십시오. 프로파일 러는 무엇이 왜 느린지를 알려주는 것입니다. – zerkms
그래서 링크 된 목록 구현이 너무 느리다는 생각이들 것입니다. 연결된 목록의 경우 10 분 이상 소요되며 배열의 경우 초도 걸리지 않습니다. – InvGhostt
"링크 된 목록 구현이 너무 느리다는 것이 정상이라고 생각합니다." --- 당신이 당신의 코드를 분석 할 필요가 있다고 대답하십시오. Big-O의 관점에서 링크 된 목록 및 배열 기반 예제 모두의 구현이 얼마나 복잡합니까? 그런 다음, 다시 - 프로파일 러. – zerkms