手寫各種排序

#include <stdio.h>

int partition(char *A, int p, int q)
{
	int i = p;
	int j = p - 1;
	char tmp;
	
	while(i != q){
		if(A[i] < A[q]){
			j++;
			tmp = A[i];
			A[i] = A[j];
			A[j] = tmp;
		}
		i++;
	}
	j++;
	tmp = A[j];
	A[j] = A[q];
	A[q] = tmp;
	return j;
	
}

void qsort(char *A, int p, int q)
{
	if(!A){
		return;
	}
	
	if(p < q){
		int ret = partition(A, p, q);
		qsort(A, p , ret - 1);
		qsort(A, ret + 1, q);
	}
}

void keep_heap(char *A, int len, int h)
{
	int l = h*2;
	int r = h*2 + 1;
	int largest = h;
	char tmp;
	
	if(l <= len && A[l] > A[largest]){
		largest = l;
	}
	
	if(r <= len && A[r] > A[largest]){
		largest = r;
	}
	
	if(largest != h){
		tmp = A[largest];
		A[largest] = A[h];
		A[h] = tmp;
		keep_heap(A, len, largest);
	}
}

void build_heap(char *A, int len)
{
	int i = len/2;
	
	for(; i > 0; i--){
		keep_heap(A, len, i);
	}
}

void hsort(char *A, int len)
{
	int i = len;
	char tmp;
	
	if(!A){
		return;
	}
	
	build_heap(A, len);
	
	for(; i > 1;){
		tmp = A[1];
		A[1] = A[i];
		A[i] = tmp;
		i--;
		keep_heap(A, i, 1);
	}
}

void merge(char *A, int p, int q, int r)
{
	int i, j, k;
	
	int l1 = q - p + 1;
	int l2 = r - q;

	char b1[100] = {0,};
	char b2[100] = {0,};
	
	memcpy(b1, A + p, l1);
	memcpy(b2, A + q + 1, l2);
	
	b1[l1] = 127;
	b2[l2] = 127;
	
	i = j = k = 0;
	for(i = p; i <= r; i++){
		if(b1[j] > b2[k]){
			A[i] = b2[k];
			k++;
		}else{
			A[i] = b1[j];
			j++;
		}
	}
}

void msort(char *A, int p, int q)
{
	if(!A){
		return;
	}
	
	if(p < q){
		int r = (p + q)/2;
		msort(A, p, r);
		msort(A, r + 1, q);
		merge(A, p, r, q);
	}
}

void nsort(char *A, int len)
{
	int i;
	char b[100] = {0,};
 	int c[10] = {0,};

	if(!A){
		return;
	}
	
	for(i = 0; i < len; i++){
		c[A[i] - '0']++;
	}
	
	for(i = 1; i < (sizeof(c)/sizeof(c[0])); i++){
		c[i] = c[i - 1] + c[i];
	}
	
	for(i = len - 1; i >= 0; i--){
		b[c[A[i] - '0'] - 1] = A[i];
		c[A[i] - '0']--;
	}
	
	memcpy(A, b, len);
}

void bsort(char *A, int len)
{
	int i, j;
	char tmp;
	
	if(!A){
		return;
	}
	
	for(i = len - 1; i >= 0; i--){
		for(j = 0; j < i; j++){
			if(A[j] > A[j + 1]){
				tmp = A[j];
				A[j] = A[j + 1];
				A[j + 1] = tmp;
			}
		}
	}	
}

void isort(char *A, int len)
{
	int i, j, k;
	char tmp;
	
	if(!A){
		return;
	}
	
	for(i = 0; i < len; i++){
		for(j = 0; j < i; j++){
			if(A[j] > A[i]){
				tmp = A[i];
				k = i;
				while(k > j){
					A[k] = A[k - 1];
					k--;
				}
				A[k] = tmp;
				break;
			}
		}
	}
}

int main()
{
	char str[] = "7658490321";
	int len = strlen(str);
	
	printf("%s\n", str);
	
	//qsort(str, 0, len - 1);
	//hsort(str - 1, len);
	//msort(str, 0, len - 1);
	//nsort(str, len);
	//bsort(str, len);
	isort(str, len);
	
	printf("%s\n", str);
	
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章