#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;
}
手寫各種排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.