スワップソート - バブルソートとクイックソート

ヒル ソートは直接挿入ソートのアップグレードであり、ヒープ ソートは単純選択ソートのアップグレードです。

クイックソートはバブルソートのアップグレードであり、すべて交換ソートに属します。

バブルソートの基本的な考え方は、隣り合うレコードのキーワードを2つずつ比較し、逆順になっていれば逆順にならなくなるまで交換するというものです。

プロセス:

最初のバブリング: 最初の要素と 2 番目の要素を比較し、順序が逆の場合は 2 つの要素を交換してから、2 番目の要素と 3 番目の要素を比較します。というように、n-1 番目の要素が n 番目の要素と比較されるまで続きます。その結果、最大の要素が最後の位置 (n 番目の位置) に配置されます。

2 番目のバブリング: 最初の n-1 要素に対して同じ操作を行うと、2 番目に大きい要素が最後から 2 番目の位置 (n-1 番目の位置) に配置されます。

……

バブリングの n-1 回目: 最初の要素と 2 番目の要素を比較し、順序が逆の場合は、2 つの要素を交換します。

すべてのレコードの並べ替えを完了します。

vector<int> bubbleSort(vector<int> list) {//冒泡排序
	vector<int> result;
	if (list.empty()) {
		return result;
	}
	result = list;
	int temp;
	for (int i = 0; i < result.size() - 1;++i) {// 要遍历的次数
		bool bChanged = false;//交换标志位
		for (int j = 0; j < result.size() - 1 - i;j++) {//从后向前依次的比较相邻两个数的大小
			if (result[j+1]<result[j]) {//如果后面的元素小,则交换它们的位置
				temp = result[j + 1];
				result[j + 1] = result[j];
				result[j] = temp;
				bChanged = true;
			}
		}
		if (false == bChanged) {//如果标志为false,说明本轮遍历没有交换,已经是有序数列,可以结束排序
			break;
		}
	}
	return result;
}

クイックソートの基本的な考え方は、ソート対象のレコードを 1 回のパスでソートすることによって 2 つの独立した部分に分割し、レコードの一方の部分のキーワードがレコードの他方の部分のキーワードよりも小さく、その後このメソッドに従って、それらを別々にソートし続けます. レコードの 2 つの部分がソートされ、全体が整うまで再帰が続きます.

プロセス:

ステップ 1: 配列が左右の部分に分割されるカットオフ値を設定します。(通常、ソートする最初のレコード、または左の最後のレコード、または中間位置などのキーワードを選択します。)

ステップ 2: シーケンスの右側にカットオフ値以上のレコードを配置し、シーケンスの左側にカットオフ値以下のレコードを配置します。

ステップ 3: 左側のサブシーケンスでステップ 1 と 2 を再帰的に実行し、右側のサブシーケンスでステップ 1 と 2 を再帰的に実行します。

……

すべてのサブシーケンスの再帰が完了するまで、すべてのレコードのソートが完了します。

int division(vector<int> &list, int left, int right) {//快速排序的division函数  
    int base = list[left];// 以最左边的数(left)为基准(通常就是选取第一个元素)  
    while (left < right) {  
        while (left < right && list[right] >= base)//从序列右端开始,向左遍历,直到找到小于base的数  
            right--;  
        list[left] = list[right];// 找到了比base小的元素,将这个元素放到左边的位置  
        while (left < right && list[left] <= base)// 从序列左端开始,向右遍历,直到找到大于base的数  
            left++;  
        list[right] = list[left];//找到了比base大的元素,将这个元素放到右边的位置  
    }  
    list[left] = base;// 最后将base放到left位置。此时,left位置的左侧数值应该都比left小,而left位置的右侧数值应该都比left大  
    return left;  
}  
  
  
void quickSort(vector<int> &list, int left, int right) {// 快速排序  
    if (left < right) {// 左下标一定小于右下标,否则就越界了  
        int base = division(list, left, right);// 对数组进行分割,取出下次分割的基准标号  
        quickSort(list, left, base - 1);// 对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序  
        quickSort(list, base + 1, right);// 对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序  
    }  
}

おすすめ

転載: blog.csdn.net/m0_74178120/article/details/129008999