1. 程式人生 > >C程式設計--排序(冒泡、選擇、插入)

C程式設計--排序(冒泡、選擇、插入)

演算法排序

個人說明:排序的演算法有許多種,該部落格只是列舉了部分常用的排序方式,以供參考。程式使用語言為C語言。

1.氣泡排序法

  • 基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

  • 圖解 在這裡插入圖片描述

  • 程式碼實現

#include<stdio.h>

int main(){
	int a[] = {5,0,3,1,2};
	int n=sizeof(a)/sizeof(int);
	for (int i = 0; i < n-1; i++) {
		for (int j = n-1; j >i; j--) {
			if (a[j-1] > a[j]) {
				int temp=a[j-1];
				a[j-1]=a[j];
				a[j]=temp;
			}
		}
	}
	for(i=0;i<n;i++){
		printf("%d ",*(a+i));
	}
	printf("\n",*(a+i));
	return 0;
}

  • 時間複雜度分析

若檔案的初始狀態是正序的,一趟掃描即可完成排序。所需的關鍵字比較次數C和記錄移動次數M均達到最小值:Cmin = N - 1, Mmin = 0。所以,氣泡排序最好時間複雜度為O(N)。 若初始檔案是反序的,需要進行 N -1 趟排序。每趟排序要進行 N - i 次關鍵字的比較(1 ≤ i ≤ N - 1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值: Cmax = N(N-1)/2 = O(N2) Mmax = 3N(N-1)/2 = O(N2) 氣泡排序的最壞時間複雜度為O(N2)。 因此,氣泡排序的平均時間複雜度為O(N2)。 總結起來,其實就是一句話:當資料越接近正序時,氣泡排序效能越好。

  • 參考部落格