排序演算法-C語言實現

不吃魚長大不會游泳啊發表於2018-11-28

#氣泡排序 ##原理: 臨近的數字兩兩進行比較, 按照從小到大或者從大到小的順序進行交換, 這樣一趟過去之後, 最大或最小的數字被交換到了最後一位. 然後再從頭開始兩兩進行比較, 直到倒數第二位時結束 ##程式碼

void bubbleSort(int *a, int n) {
	int exeCount = 0;
	for(int i = 0; i < n - 1; i++) {
		for(int j = 0; j < n - 1 - i; j++) {
			if (a[j] > a[j + 1]) {
				swap(a + j , a + j + 1);
			}
		}
	}
}
複製程式碼

##優化 有一個無序數列(2,1,3,4,5,6,7,8,9,10), 從第一次迴圈交換後的操作,可以說都是沒必要的。所以需要優化 優化方式: 設定一個標記變數, 標記數列中的數是否在迴圈結束前就已經排好序 ##優化程式碼

void bubbleSortBetter(int *a, int n) {
	bool isSorted = true;
	for(int i = 0; i < n - 1 && isSorted; i++) {
		isSorted = false;
		for(int j = 0; j < n - 1 - i; j++) {
			if (a[j] > a[j + 1]) {
				isSorted = true;
				swap(a + j , a + j + 1);
			}
		}
	}
}
複製程式碼

#快速排序 ##原理 設要排序的陣列是a[0]...a[n-1], 首先任取一個資料(一般第一個元素)最為關鍵資料, 然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。然後對關鍵資料兩邊的資料,再分組分別進行上述的過程,直到不能再分組(只有一個資料)為止。 多個相同值的相對位置也許會在演算法結束時產生變動 ##程式碼

void quickSort(int *a, int low, int high) {
        // 如果左邊索引大於或者等於右邊的索引就代表已經整理完成一個組了
	if (low >= high) {
		return;
	}
	
	int first = low;
	int last = high;
	int key = a[first];
	
	while (first < last) {
		while (first < last && a[last] >= key) {
			--last;			
		}
		a[first] = a[last];
		while (first < last && a[first] <= key) {
			++first;
		}
		a[last] = a[first];		
	}	
	a[first] = key;
	quickSort(a, low, first - 1);
	quickSort(a, first + 1, high);
}
複製程式碼
void quickSort(int *a, int low, int high) {
    
    if (low < high) {
        int pivotLoc = Partition(a, low, high);
        quickSort(a, low, pivotLoc - 1);
        quickSort(a, pivotLoc + 1, high);
    }
}

int Partition(int *a, int low, int high) {
    
    int pivotKey = a[low];
    while (low < high) {
        while (low < high && a[high] >= pivotKey) {
            --high;
        }
        a[low] = a[high];
        while (low < high && a[low] <= pivotKey) {
            ++low;
        }
        a[high] = a[low];
    }
    a[low] = pivotKey;
    return low;
}
複製程式碼

相關文章