排序總結

各種排序的總結

#include<iostream>
using namespace std;
//直接插入排序
void insertSort(int  arr[] ,int size){
	for(int i=1;i<size;i++){
		int temp = arr[i];
		int j = i-1;
		while(j >= 0 && arr[j] > temp){
			arr[j+1] = arr[j];
			j--;
		}
		arr[j+1] = temp;
	}	

}

//希爾排序
void shellSort(int arr[],int size){
	int d = size/2;
	while(d>=1){
		for(int i=0;i<d;i++){
			for(int j=i+d;j<size;j+=d){
				int temp = arr[j];
				int k = j-d;
				while(k >= i && arr[k] > temp){
					arr[k+d] = arr[k];
					k -= d;
				}
				arr[k+d] = temp;
			}
		}
		d = d/2;
	}
}

//冒泡排序
void bubbleSort(int arr[], int size){
	for(int i=0;i<size-1;i++){		
		for(int j=0;j<size-1-i;j++){
			if(arr[j] > arr[j+1]){
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}

	}
}

//快排
void  quickSort(int arr[], int l, int r){
	int left = l,right = r;
	int pivot = arr[left];
	while(left < right){
		while(left < right && arr[right] >= pivot )
			right --;
		arr[left] = arr[right];
		while(left < right && arr[left] <= pivot)
			left ++;
		arr[right] = arr[left];
	}
	arr[left] = pivot;
	if(left-1 > l)
		quickSort(arr,l, left-1);
	if(left+1  < r)
		quickSort(arr,left+1,r);
}

//選擇排序
void selectSort(int arr[], int size){
	for(int i=0;i<size-1;i++){
		int min =i;
		for(int j=i+1;j<size;j++){
			if(arr[j] < arr[min])
				min = j;
		}
		int temp = arr[i];
		arr[i] = arr[min];
		arr[min] = temp;
	}

}

//堆排
void siftDown(int arr[], int i, int size){
	int  l = 2*i+1, r = 2*i+2;
	int min = i;
	if(l< size && arr[l] > arr[min])
		min = l;
	if(r<size && arr[r] > arr[min])
		min = r;
	if(i!= min){
		int temp = arr[min];
		arr[min] = arr[i];
		arr[i] = temp;
		siftDown(arr, min, size);
	}
}

void heapSort(int arr[], int size){
	int  p = size/2 - 1;
	for(int i=p;i>=0;i--)
		siftDown(arr,i,size);
	for(int i=size-1;i>=0;i--){
		int temp = arr[0];
		arr[0] = arr[i];
		arr[i] = temp;
		siftDown(arr,0,i);
	}
}

//歸併排序
void merge(int arr[], int left, int mid, int right){
	int * temp = new int[right-left+1];
	int i = left, j = mid+1;
	int k=0;
	while(i <= mid && j <= right ){
		if(arr[i] < arr[j])
			temp[k++] = arr[i++];
		else
			temp[k++] = arr[j++];
	}
	while(i <= mid)
		temp[k++] = arr[i++];
	while(j <= right)
		temp[k++] = arr[j++];
	for(int i=0;i<right-left+1;i++)
		arr[left+i] = temp[i];
	delete [] temp;
}
void mergeSort(int arr[], int left, int right){
	if(left < right){
		int mid = (left+right)/2;
		mergeSort(arr,left,mid);
		mergeSort(arr,mid+1,right);
		merge(arr,left,mid,right);
	}
}
int main(){

	int n;
	cin >> n;
	int* arr = new int[n];
	for(int i=0;i<n;i++)
		cin>>arr[i];
	//quickSort(arr, 0, n-1);
	mergeSort(arr, 0,n-1);
	for(int i=0;i<n;i++)
		cout<<arr[i]<<' ';
	return 0;
}

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