排序算法僞碼模板

插入排序

直接插入排序–穩定

最好情況O(n)
平均情況O(n2)
最壞情況O(n2)

void insertsort(Elemtype a[], int n){
	int i, j;
	for(int i = 2; i<=n; i++){
		if(a[i] < a[i-1]){
			a[0] = a[i];
			for(int j = i-1; a[0] < a[j]; --j){
				a[j+1] = a[j];
			}
			a[j+1] = a[0];
		}
	}
}

折半插入排序–穩定

O(n2)
比較次數:O(nlog2n)

void insertsort(Elemtype a[], int n){
	int i, j;
	int low, high, mid;
	for(int i = 2; i<=n; i++){
		if(a[i] < a[i-1]){
			a[i] = a[0];
			low = 1;
			high = i-1;
			while(low <= high){
				mid = (low + high) / 2;
				if(a[0] < a[mid])  high = mid - 1;
				else low = mid + 1;
			}
			for(int j = i-1; j>=high+1; j--){
				a[j+1] = a[j];
			}
			a[high+1] = a[0];
		}
	}
}

希爾排序–不穩定

增量系列:d1=n/2   di+1=di/2(向下取整)

void shellsort(Elemtype a[], int n){
	for(int dk = n/2; dk>=1; dk=dk/2){
		for(int i = dk+1; i<=n; i++){
			if(a[i] < a[i-dk]){
				a[0] = a[i];
				for(int j = i-dk; j>0&&a[j]>a[0]; j-=dk){
					a[j+dk] = a[j]; 
				}
				a[j+dk] = a[0];
			}
		}
	}
}

交換排序

冒泡排序–穩定

最好情況:O(n):比較次數n-1 移動0次
最壞情況:O(n2):需進行n-1趟 第i趟比較n-i次
平均情況:O(n2)

void bubblesort(Elemtype a[], int n){
	for(int i = 0; i<n-1; i++){
		int flag = false;
		for(int j = n-1; j>i; j--){
			if(a[j] < a[j-1]){
				swap(a[j], a[j-1]);
				flag = true;
			}
		}
		if(flag == false)
		
	}
}

快速排序–不穩定

最壞情況:O(n2)
最好情況:O(nlog2n)
空間複雜度:

  • 最好情況:O(log2n)
  • 最壞情況:O(n)
  • 平均情況:O(log2n)
int partition(Elemtype a[], int low, int high){
	Elemtype p = a[low];
	while(low < high){
		while(high>low && a[high]>=p) high--;
		a[low] = a[high];
		while(low<high && a[low]<=p) low++;
		a[high] = a[low];
	}
	a[low] = p;
	
	return low;
}

void quicksort(Elemtype a[], int low, int high){
	if(low < high){
		int mid = partition(a, low, high);
		quicksort(a, low, mid-1);
		quicksort(a, mid+1, high);
	}
}

選擇排序

直接選擇排序–不穩定

平均O(n2): 移動次數n(n-1)/2

void selectsort(Elemtype a[], int n){
	 int i, j;
	 for(i = 0; i<n-1; i++){
	 	int min = i;
	 	for(j = i+1; j<n; j++){
		 	if(a[j] < a[i]) min = j;
		 }
		 if(min != i)  swap(a[min], a[i]);
	 }
}

堆排序–不穩定

時間複雜度O(nlog2n):建堆時間O(n),共需n-1次向下調整

void buildmaxHeap(Elemtype a[], int len){
	for(int i = len/2; i>0; i--)
		headAdjust(a, i, len);
}

void headAdjust(Elemtype a[], int k, int len){
	a[0] = a[k];
	for(int i = 2*k; i<=len; i*=2){
		if(i<len && a[i] < a[i+1])
			i++;
		if(a[0] >= a[i])  break;
		else {
			a[k] = a[i];
			k = i;
		} 
	}
	a[k] = a[0];
}

void heapsort(Elemtype a[], int len){
	buildmaxHeap(a, len);
	for(int i = len; i>0; i--){
		swap(a[i], a[1]);
		headAdjust(a, 1, i-1);
	}
}

歸併排序 --穩定

時間複雜度:O(nlog2n):每趟O(n),供需log2n趟(向下取整)
空間複雜度:O(n)

Elemtype *b = (Elemtype*)malloc((n+1)*sizeof(Elemtype));
void merge(Elemtype a[], int low, int mid, int high){
	int i, j, k;
	for(k = low; k<=high; k++){
		b[k] = a[k];
	}
	
	for(i = low, j = mid+1, k = i; i<=mid && j<=high; k++){
		if(b[i] < b[j])
			a[k] = b[i++];
		else
			a[k] = b[j++];
	}
	
	while(i <= mid)
		a[k++] = b[i++];
	while(j <= high)
		a[k++] = b[j++];
} 

void mergeSort(Elemtype a, int low, int high){
	if(low < high){
		int mid = (low+high) / 2;
		mergeSort(low, mid);
		mergeSort(mid+1, high);
		merge(a, low, mid, high);
	}
}

基數排序–穩定

時間複雜度O(d(n+r)):需進行d趟分配與收集,一趟分配需O(n),一趟收集需O®
high){
if(low < high){
int mid = (low+high) / 2;
mergeSort(low, mid);
mergeSort(mid+1, high);
merge(a, low, mid, high);
}
}


# 基數排序--穩定

**時間複雜度O(d(n+r))**:需進行d趟分配與收集,一趟分配需O(n),一趟收集需O(r)
**空間複雜度O(r)**:r個隊列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章