zoukankan      html  css  js  c++  java
  • 排序算法

    对于普通的递增排序,使用常见的排序算法即可解决,对于较为复杂的排序,可以先重载结构体的 < 运算符,然后使用sort函数进行排序。

    sort会根据<的规则进行递增排序,要得到递减序列,只需要将<重载成相反的返回值。

    用法:

    ①引入<algorithm>头文件。

    ②对于内置类型,直接使用sort(<start address>,<end address>)即可得到递增序列,对于自定义类型或者复杂类型,重载<运算符。


    需要注意的是sort函数的入口的end address是不包含的,例如一个数组table有5个元素,应该传入table和table+5


    下面附上学习数据结构排序一章所收获的排序算法,他们的统一接口为X_sort(int* A , int N);

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    #define cutoff 100
    
    void Bubble_Sort(int* A, int N){
    	bool flag = false;
    	for (int P = N - 1; P >= 0; P--){
    		flag = false;
    		for (int i = 0; i < P; i++){
    			if (*(A + i)>*(A + i + 1)){
    				flag = true;
    				int temp = *(A + i);
    				*(A + i) = *(A + i + 1);
    				*(A + i + 1) = temp;
    			}
    		}
    		if (flag == false) break;
    	}
    }
    
    void Insert_Sort(int*A, int N){
    	for (int P = 1; P < N; P++){
    		int temp = *(A + P);
    		int i = 0;
    		for (i = P; i >= 1 && *(A + i - 1)>temp; i--){
    			*(A + i) = *(A + i - 1);
    		}
    		*(A + i) = temp;
    	}
    }
    
    void Shell_Sort(int*A, int N){
    	for (int D = N / 2; D > 0; D /= 2){
    		for (int P = D; P < N; P += D){
    			int temp = *(A + P);
    			int i = 0;
    			for (i = P; i >= D&&*(A + i - D)>temp; i -= D){
    				*(A + i) = *(A + i - D);
    			}
    			*(A + i) = temp;
    		}
    	}
    }
    
    //Heap Sort use the maxHeap,so it needs the PercDown(bigger up version)
    void PercDown(int*A, int i, int N){
    	int Child;
    	int temp;
    	for (temp = *(A + i); (2 * i + 1) < N; i = Child){
    		Child = 2 * i + 1;
    		if ((Child != N - 1) && (*(A + Child + 1) > *(A + Child))){
    			Child += 1;
    		}
    		if (temp < *(A + Child)){
    			*(A + i) = *(A + Child);
    		}else 
    			break;
    	}
    	*(A + i) = temp;
    }
    
    void Heap_Sort(int*A, int N){
    	for (int i = N / 2; i >= 0; i--){
    		PercDown(A, i, N);
    	}
    	for (int i = N - 1; i > 0; i--){
    		int temp = *(A + 0);
    		*(A + 0) = *(A + i);
    		*(A + i) = temp;
    		PercDown(A, 0, i);
    	}
    }
    
    void Merge(int* A, int* TmpA, int L, int R, int RightEnd){
    	int LeftEnd = R - 1;
    	int Tmp = L;
    	int NumElements = RightEnd - L + 1;
    	while (L <= LeftEnd&&R <= RightEnd){
    		if (*(A + L) < *(A + R)){
    			*(TmpA + Tmp++) = *(A + L++);
    		}
    		else{
    			*(TmpA + Tmp++) = *(A + R++);
    		}
    	}
    	while (L <= LeftEnd)
    		*(TmpA + Tmp++) = *(A + L++);
    	while (R <= RightEnd)
    		*(TmpA + Tmp++) = *(A + R++);
    	for (int i = 0; i < NumElements; i++, RightEnd--){
    		*(A + RightEnd) = *(TmpA + RightEnd);
    	}
    }
    
    void M_Sort(int* A, int* TmpA, int L, int RightEnd){
    	int Center;
    	if (L < RightEnd){
    		Center = (L + RightEnd) / 2;
    		M_Sort(A, TmpA, L, Center);
    		M_Sort(A, TmpA, Center + 1, RightEnd);
    		Merge(A, TmpA, L, Center + 1, RightEnd);
    	}
    }
    
    void Merge_Sort(int* A, int N){
    	int* TmpA = (int*)malloc(N*sizeof(int));
    	if (TmpA != NULL){
    		M_Sort(A, TmpA, 0, N - 1);
    	}
    }
    
    void Swap(int* p1, int* p2){
    	int temp = *p2;
    	*p2 = *p1;
    	*p1 = temp;
    }
    
    int Median3(int* A, int left, int right){
    	int center = (left + right) / 2;
    	if (*(A + left) > *(A + center))
    		Swap(A + left, A + center);
    	if (*(A + left) > *(A + right))
    		Swap(A + left, A + right);
    	if (*(A + center) > *(A + right))
    		Swap(A + center, A + right);
    	Swap(A + center, A + right - 1);
    	return *(A + right - 1);
    }
    
    void Quicksort(int* A, int left, int right){
    	if (cutoff <= right - left){
    		int Pivot = Median3(A, left, right);
    		int i = left;
    		int j = right - 1;
    		while (1){
    			while (A[++i] < Pivot);
    			while (A[--j] > Pivot);
    			if (i < j)
    				Swap(A + i, A + j);
    			else
    				break;
    		}
    		Swap(A + i, A + right - 1);
    		Quicksort(A, left, i - 1);
    		Quicksort(A, i + 1, right);
    	}
    	else{
    		Insert_Sort(A + left, right - left + 1);
    	}
    }
    
    void Quick_sort(int* A, int N){
    	Quicksort(A, 0, N - 1);
    }
    
    void Print_table(int* A, int N){
    	for (int i = 0; i < N; i++){
    		if (i == N - 1){
    			printf("%d
    ", *(A + i));
    		}
    		else{
    			printf("%d ", *(A + i));
    		}
    	}
    }
    其中有的算法:

    Bubble_Sort

    Insert_Sort

    Shell_Sort

    Heap_Sort

    Merge_Sort

    Quick_Sort


  • 相关阅读:
    MySQL数据模型
    Spring循环依赖
    @Autowired和@Resource区别
    Kafka概念
    阻塞队列
    线程池原理
    Spring AOP
    JVM 史上最最最完整深入解析(12000 字噢)
    Dubbo配置信息
    友情链接
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154261.html
Copyright © 2011-2022 走看看