정렬 요약: 쌓 기 정렬, 빠 른 정렬, 병합 정렬, 기수 정렬

정렬 알고리즘 은 서로 다른 방식 으로 서로 다른 분 류 를 할 수 있 습 니 다. 내부 정렬 과 외부 정렬 으로 나 눌 수 있 습 니 다.안정성 정렬 과 불안정 정렬.
우리 가 자주 사용 하 는 간단 한 정렬 방법 (선택, 교환, 삽입) 은 쉽게 이해 하고 실현 되 지만 그들의 효율 이 높 지 않다 는 점 은 데이터 양 이 많 을 때 특히 현저 하 다.
본 고 는 더욱 효율 적 인 정렬 모델 (쌓 기 정렬, 빠 른 정렬, 병합 정렬, 기수 정렬) 의 알고리즘 과 실현 을 간략하게 소개 하고 자 합 니 다. 주로 본인 이 최근 에 배 운 정리 에 사 용 됩 니 다. 여러분 은 뿌리 지 마 세 요.
  • 더미 정렬 
  • 알고리즘 요약: 쌓 기 는 완전 이 진 트 리 로 그 중에서 각 노드 의 데이터 항목 이 하위 트 리 의 데이터 항목 보다 크 거나 같 습 니 다.우 리 는 더미 로 정렬 을 실현 합 니 다. 사실은 트 리 구 조 를 이용 하여 편리 한 장점 을 찾 는 것 입 니 다. 이런 정렬 방법 은 STL 에서 이 루어 졌 고 대응 하 는 함수 명 은 각각 Make 입 니 다.heap、push_heap、pop_heap、sort_heap。최대 더미 에 대해 쌓 인 뿌리 는 실제 적 으로 쌓 인 모든 요소 의 최대 치 이다. 뿌리 요 소 를 마지막 요소 로 교환 한 다음 에 쌓 인 잉여 요 소 를 조정 하여 나머지 요소 중의 최대 치 를 찾 는 것 이다. 이것 은 실제 적 으로 정렬 법 을 선택 하 는 사상 이다. 조정 을 통 해 요소 중의 최대 치 를 찾 은 다음 에 꼬리 에 놓 는 것 이다.
  • 실현 코드:
  • #include 
    #include 
    #include 
    #include 
    #include 
    
    int * rand_seq(int num)
    {
    	int *tem=new int[num];
    	srand((unsigned)time(NULL));
    	for(int i=0;i(std::cout,"  "));
    	std::cout<<:endl void="" adjust_heap="" int="" i="" num="" if="" left="2*i+1;" right="2*i+2;" index="(left<num&&data[left]">data[i])?
    		((rightdata[left])?right:left):
    		 ((rightdata[i])?right:i);
    		//   
    		if(i!=index) 
    		{
    			std::swap(data[i],data[index]);
    			adjust_heap(data,index,num);
    		}
    	}
    } 
    //             
    void  build_heap(int *data, int num)
    {
    	int tree_index=(num-1)/2;//         
    	for(int i=tree_index;i>=0;i--) 
    		adjust_heap(data,i,num);
    } 
    
    
    void heap_sort(int *data, int num)
    {
    	if(num>1)
    	{
    		build_heap(data,num);
    		do
    		{
    			std::swap(data[0],data[--num]);
    			adjust_heap(data,0,num);
    		}while(num>1);
    	}
    }
    
    int main(int argc, char** argv) {
    	int *data=rand_seq(20);
    	print(data,20);
    	heap_sort(data,20);
    	print(data,20);
    	delete[] data;
    	return 0;
    }
     
      

    • 快速排序
    • 算法总结:在冒泡排序法中,把一个元素移动到它的正确位置,需要许多次与相邻元素交换,往往很多交换都不是必须的。作为改进,快速排序法每次找到元素的正确位置,并交换,而且采用分治策略,将数据分成两部分。更贴切第讲:每次选定一个元素,将数据分成大于和小于等于该元素的两部分,再对两部分进一步快速排序。
    • 实现代码:
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int * rand_seq(int num)
    {
    	int *tem=new int[num];
    	srand((unsigned)time(NULL));
    	for(int i=0;i(std::cout,"  "));
    	std::cout<<:endl void="" quick_sort="" start="" end="" if="" int="" tem="data[start];//    " left="start;" right="end;" while="">tem) --right;
    			while(left
  • 병합 정렬
  • 알고리즘 요약: 우리 가 자주 사용 하 는 병합 은 실제 적 으로 반 으로 나 누 어 정렬 하 는 것 이다. 이것 은 분 치 전략 을 사용 하여 정렬 할 서열 을 모두 두 부분 으로 나 누고 한 부 씩 나 누 어 정렬 한 다음 에 정렬 할 두 서열 을 합 쳐 질서 있 는 전체 서열 을 형성한다.
  • 실현 코드:
  • #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int * rand_seq(int num)
    {
    	int *tem=new int[num];
    	srand((unsigned)time(NULL));
    	for(int i=0;i(std::cout,"  "));
    	std::cout<<:endl void="" merge="" start="" mid="" end="" int="" for="" i="0;i<mid-start+1;i++)" left="" right="" j="0;" while="" if="" data="" else="" delete="" merge_sort="" main="" argc="" char="" argv="" print="" return=""/>
  • 기수 정렬
  • 알고리즘 요약: 기수 정렬 은 독특한 정렬 방식 으로 숫자 를 나타 내 는 방식 입 니 다. 기본 사상: 한 조 의 수 에 대해 먼저 여러분 에 게 순 서 를 매 긴 다음 에 10 자리 에 대해 순 서 를 매 깁 니 다. 백 자리...이렇게 하면 십 진법 의 수 에 대해 용기 라 고 정의 할 수 있다. 이 과정 은 각각 낮은 것 에서 높 은 것 으로 용기 에 넣 고 용 기 를 꺼 내 는 것 으로 묘사 할 수 있다.
  • 실현 코드:
  • #include 
    #include 
    #include 
    #include 
    #include 
    
    int * rand_seq(int num)
    {
    	int *tem=new int[num];
    	srand((unsigned)time(NULL));
    	for(int i=0;i(std::cout,"  "));
    	std::cout<<:endl int="" pos_num="" data="" pos="" tem="1;" for="" i="1;i<pos;i++)" return="" struct="" container="" num="" void="" radix_sort="" con="" k="1;k<=2;k++)//       " con_data_num="con[i].num;" j="0;j<con_data_num;j++)" main="" argc="" char="" argv="" print="" delete=""/>

    좋은 웹페이지 즐겨찾기