c\#가장 간결 하고 빠 른 정렬 을 실현 합 니 다(당신 은 충분히 알 수 있 습 니 다)

4364 단어 c#정렬알고리즘
머리말
알고리즘 은 프로그래머 의 중요성 에 대해 말 하지 않 아 도 알 수 있 습 니 다.오늘 저 는 알고리즘 중의 기본 알고리즘 을 공유 하고 빠 른 정렬 을 하 겠 습 니 다.프로그래머 로 서 모두 가 낯 설 지 않다 고 믿 지만 맨손으로 한꺼번에 쓰 는 것 은 어 려 울 것 같 습 니 다.그렇게 쓸데없는 말 이 많 지 않 으 니,나 는 먼저 개념 을 간단하게 줄 일 게.
빠 른 정렬 알고리즘 설명:
원시 배열 L1 은 그 중에서 기준 수 F(보통 첫 번 째 선택)를 임의로 선택 하고 F 보다 작은 데 이 터 는 F 의 왼쪽 에 배열 minList 로 기록 하 며 F 보다 큰 데 이 터 는 F 의 오른쪽 에 배열 max List 로 기록 합 니 다.그렇게
L1=minList+F+maxList
그리고 minList 와 max List 에 대해 서 는 minList 와 max List 의 요소 개수 가 1 또는 0 일 때 까지 이러한 작업 을 합 니 다.
1.C\#인터넷 에서 현재 가장 간결 한 실현 방식:
지금 은 바로 산법 의 실현 을 진행 해 야 한다.분명 하 다.여기 서 재 귀 라 는 사상 을 사용 해 야 한다.우 리 는 프로 그래 밍 언어 지식 도구,알고리즘 이 핵심 이라는 것 을 알 고 있 지만 서로 다른 프로 그래 밍 언어 실현 알고리즘 은 크게 다르다(간결 정도).현재 인터넷 에 서 는 c\#의 빠 른 정렬 을 실현 하 는 방식 이 매우 많 습 니 다.간단하게 찾 아 보 니 보통 100 줄 정도 의 코드 가 필요 합 니 다(c 와 c+의 코드 줄 수 는 적 습 니 다).이것저것 찾다 가 마침내 하 나 를 찾 았 습 니 다.다음 과 같이 붙 여 주세요.

static void QuickSort(ref List<int> nums, int left, int right)
 {
  if (left < right)
  {
  int i = left;
  int j = right;
  int middle = nums[(left + right) / 2];
  while (true)
  {
   while (i < right && nums[i] < middle) { i++; };
   while (j > 0 && nums[j] > middle) { j--; };
   if (i == j) break;
   int temp = nums[i];
   nums[i] = nums[j];
   nums[j] = temp;
   if (nums[i] == nums[j]) j--;
  }
  QuickSort(ref nums, left, i);
  QuickSort(ref nums, i + 1, right);
  }
 }
하지만 정말 읽 기 어렵 습 니 다.정말 시험장 에서 이 코드 를 써 야 합 니 다.한 번 에 맞 출 수 있 을 지 모 르 겠 습 니 다.
2.python 의 실현 방식:
python 저도 접촉 이 있 습 니 다.그래서 제 가 python 으로 이 알고리즘 의 코드 를 썼 을 때 정말 느낌 이 들 었 습 니 다.정말 TM 간단 하 죠?프로 그래 밍 경험 이 있 는 친구 들 도 아래 의 python 코드 를 알 아 볼 수 있 을 것 입 니 다.

def quicksort(array): 
 if len(array) < 2:  
  return array ------    :              “  ”  
 else:  
  pivot = array[0] ------    
  less = [i for i in array[1:] if i <= pivot] ------                   
  greater = [i for i in array[1:] if i > pivot] ------                   
 return quicksort(less) + [pivot] + quicksort(greater) 
print quicksort([10, 5, 2, 3])
몇 줄 의 코드 가 짧 고 명료 하 다.주요 코드 는 바로 배열 이 직접 연산 할 수 있다 는 것 이다quicksort(less) + [pivot] + quicksort(greater)3.C\#스스로 실현 하 는 가장 쉬 운 방식
그럼 우리 c\#어 려 운 코드 만 써 야 되 는 거 야?드디어 나 도 찾 았 다.아래 에 내 가 쓴 c\#코드 가 붙 어 있다.

public class Extend :List<int>
 {
  public static Extend operator +(Extend L1, Extend L2)
  {
   L1.AddRange(L2);
   return L1;
  }
 }

  static Extend QuickSort2(Extend nums)
  {
   if (nums.Count < 2)
   {
    return nums;
   }
   else
   {
    Extend minList = new Extend();//        
    Extend maxList = new Extend();//        
    int f = nums[0];
    for (int i = 1; i < nums.Count; i++)
    {
     if (nums[i] <= f) minList.Add(nums[i]);
     else maxList.Add(nums[i]);
    }
    return QuickSort2(minList) + new Extend() { f} + QuickSort2(maxList);//  ,    +   
   }
  }
실제로 두 단계 만 조작 하면 python 과 같은 간결 함 을 실현 할 수 있 습 니 다!
첫 번 째:리스트에 확장 클래스 를 계승 합 니 다.
두 번 째:+연산 자 를 다시 썼 습 니 다.
어떤 학생 이 Extended 류 중의 AddRange 방법 에 대해 메모리 상의 의문 을 제 기 했 고 저도 대답 을 했 습 니 다.알고리즘 은 시간 복잡 도 에 대한 고찰,즉 과정 에 대한 고찰 입 니 다.메모리 소 모 는 코드 에 따라 다 를 수 있 지만 알고리즘 에 영향 을 주지 않 습 니 다.물론 저도 Extend 를 개선 하 였 습 니 다.왜냐하면 실제 최종 덧셈 연산 에서 minList 와 maxList 는 모두 하나의 요소 만 있 거나 요소 가 없 기 때 문 입 니 다.

public class Extend :List<int>
 {
  private static Extend k = new Extend();
  
  public static Extend operator +(Extend L1, Extend L2)
  {
   if (L1.Count == 1) k.Add(L1[0]);
   if (L2.Count == 1) k.Add(L2[0]);
   return k;
   //L1.AddRange(L2);
   //return L1;
  }
 }
나머지 는 python 코드 와 기본적으로 일치 하고 코드 가 명확 합 니 다.
내 가 관찰 한 바 에 의 하면 c\#나 같은 방식 으로 이 루어 진 것 인 데,현재 이 한 몫 만 받 으 면 고 맙 지 않 아!마지막 으로 한 마디 하 겠 습 니 다.어쩐지 python 이 지금 이렇게 핫 하 더 라 니 코드 가 정말 간단 하 더 라 고요.그러나 가장 프로그래머 인 우 리 는 언어 는 도구 일 뿐 우리 가 언어의 주재자 라 는 것 을 항상 기억 해 야 한다.코드 뒤의 사상 을 이해 하 는 것 이 왕도 다!
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기