【原創】本身寫的幾個排序算法

#include<iostream>
using namespace std;

/*交換*/ 
void swap(int *x,int *y){
	int temp;
	temp=*x;
	*x=*y;
	*y=temp;
}

/*打印*/ 
void print(int *a,int length){
	int i;
	for(i=0;i<length;i++)
		cout << *(a+i) << " ";
	cout<<endl;
}

/*起泡排序*/
void sort_bubble(int *a,int length){
	int i,j;
	for(i=0;i<length-1;i++){//外層循環,控制循環比較趟數 
		for(j=0;j<length-1-i;j++){//內層循環,控制比較位置 
			if(*(a+j)>*(a+j+1))//判斷是否符合交換規則 
				swap(a+j,a+j+1);
		}
	} 
	print(a,length);
}

/*選擇排序*/
void sort_select(int *a,int length){
	int i,j,k;
	for(i=0;i<length-1;i++){//外層循環,控制每一趟起始位置 
		for(j=i+1;j<length;j++){//內層循環,控制每趟循環比較次數 
			if(*(a+i)>*(a+j))//判斷是否符合交換規則 
				swap(a+i,a+j);
		}
	} 
	print(a,length);
}

/*歸併排序細節*/
void merge(int *a,int first,int middle,int last){
	int n=0;
	int i=first,j=middle+1; 
	int b[last+1];//數組b暫存排好序的元素 
	while(i<=middle&&j<=last){
		if(a[i]<a[j])
			b[n++]=a[i++];
		else
			b[n++]=a[j++];
	}
	while(i<=middle)
		b[n++]=a[i++];
	while(j<=last)
		b[n++]=a[j++];

	int k;
	for(k=first;k<first+n;k++)//難點、易錯點 
		a[k]=b[k-first]; 
}

/*歸併排序主體*/
void mergesort(int *a,int first,int last){
	if(first<last){
		int middle=(first+last)/2;
		mergesort(a,first,middle);
		mergesort(a,middle+1,last);
		merge(a,first,middle,last);
	}
}  

/*歸併排序*/
void sort_merge(int *a,int first,int last){
	mergesort(a,first,last);
	print(a,last+1);
}  

/*快速排序細節*/
void quicksort(int *a,int low,int high){
	int first=low;
    int last=high;
    int key=a[low];//哨兵 
    if(low>=high)//若是low>=high說明排序結束了
        return;
    while(low<high){//該while循環結束一次表示比較了一輪
        while(low<high&&key<=a[high])
            --high;//向前尋找
        if(key>a[high]){
            swap(&a[low],&a[high]);
            ++low;
        }
        while(low<high&&key>=a[low])
            ++low;//向後尋找
        if(key<a[low]){
            swap(&a[low],&a[high]);
            --high;
        }
    }
    quicksort(a,first,low-1);  //用一樣的方式對分出來的左邊的部分進行同上的作法
    quicksort(a,low+1,last);  //用一樣的方式對分出來的右邊的部分進行同上的作法
}

/*快速排序*/
void sort_quick(int *a,int low,int high){
	quicksort(a,low,high);
	print(a,high+1);
}

/*主函數*/ 
int main(){

	int a[]={62,41,51,99,79,13,54,53,30,73};
	
	int i,j,length;
	
	length=sizeof(a)/sizeof(a[0]);
	
	//sort_bubble(a,length);
	//sort_select(a,length);
	//sort_merge(a,0,length-1);
	sort_quick(a,0,length-1);

	return 0;
}
相關文章
相關標籤/搜索