几种排序(堆排序,插入排序等)

选择排序(注意如果maxi为begin,那么再将begin与mini对换的时候,maxi其实是现在mini指向的,故要让maxi=mini

void selectsort(int*a,int n){
	int begin=0;
	int end=n-1;
	while(begin<end){
		int mini=begin;
		int maxi=begin;
	    for(int i=begin;i<=end;i++){
	    	if(a[i]<a[mini]){
	    		mini=i;
			}
			if(a[i]>a[maxi]){
				maxi=i;
			}
		}
		swap(&a[begin],&a[mini]);
		if(begin==maxi){
			maxi=mini;
		}
		swap(&a[maxi],&a[end]);
        begin++;
        end--;
	}
}

堆排序

void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
void adjustdown(int* a,int n ,int  parent) {
    int child = parent * 2 + 1;
    while (child < n) {
        if (child + 1 < n && a[child] > a[child + 1]) {
            child++;
        }
        if (a[child] < a[parent]) {
            swap(&a[child], &a[parent]);
            parent = child;
            child = parent * 2 + 1;
        }
        else {
            break;
        }
    }
}
void heapsort(int* a, int n) {
    for (int i = (n - 1 - 1) / 2;i >= 0;i--) {
        adjustdown(a, n, i);
    }
    int end = n - 1;
    while (end > 0) {
            swap(&a[0], &a[end]);
            adjustdown(a, end, 0);
            end--;
    }
}

插入排序

void insertsort(int*a,int n){
	for(int i=0;i<n-1;i++){
		int tmp=a[i+1];
		int end=i;
		while(end>=0){
			if(a[end]>tmp){
				a[end+1]=a[end];
				end--;
			}
			else{
				break;
			}
		}
		a[end+1]=tmp;
	}
}

希尔排序

void shellsort(int* a, int n) {
int gap=n;
while(gap>1){
	gap=gap/3+1;
	for(i=0;i<n-1;i++){
		int tmp=a[i+gap];
		int end=i;
		while(end>=0){
			if(a[end]>tmp){
				a[end+gap]=a[gap];
				end-=gap;
			}
			else{
				break;
			}
		}
		a[end+gap]=tmp;
	}
}
}

你可能感兴趣的:(排序算法,算法,数据结构)