经典排序之选择排序、插入排序、冒泡排序、希尔排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zpalyq110/article/details/79416067

选择排序

void selectionSort(int arr[], int n) {
	for (int i = 0; i < n; i++) {
		int minIndex = i; // 记录待排数组中最小元素的下标
		for (int j = i + 1; j < n; j++) {
			if (arr[j] < arr[minIndex])
				minIndex = j;
		}
		swap(arr[minIndex], arr[i]);
	}
}

插入排序

void insertionSort(int arr[], int n) {
	for (int i = 0; i < n; i++) {
		for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) 
			swap(arr[j], arr[j - 1]);  // 乱序直接交换
	}
}

void insertionSortUp(int arr[], int n) {  // 改进版,不交换,找到合适位置,将其插入
	for (int i = 0; i < n; i ++) {
		int e = arr[i];
		int j;
		for (j = i; j > 0 && e < arr[j - 1]; j --)
			arr[j] = arr[j-1];
		arr[j] = e;
	}
}

冒泡排序

void bubbleSort(int arr[], int n) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n - i - 1; j++) { // 控制上限,保证最大的最后面的元素不被再次比较,节省时间
			if (arr[j] > arr[j + 1])
				swap(arr[j], arr[j + 1]);
		}
	}
}

希尔排序

void shellSort(int arr[], int n) {
	int h = 1;
	while (h < n / 3)    // 创建缩量
		h = h * 3 + 1;
	while (h >= 1) {
		for (int i = h; i < n; i++) { //arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... 使用插入排序
			int j;
			int e = arr[i];
			for (j = i; j >= h && arr[j - h] > e; j-= h)
				arr[j] = arr[j-h];
			arr[j] = e;
		}
		h /= 3;
	}
}


猜你喜欢

转载自blog.csdn.net/zpalyq110/article/details/79416067