std中稳定排序算法_稳定排序算法

常用排序算法?

稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。

9367f441ad1905e9ed7a405923e2e130.png

冒泡排序算法

比较相邻的元素,按照顺序进行交换,一次遍历后,就会有一个最大(最小)交换至顶端,重复步骤即可。

python实现:

arr = [54,26,93,17,77,31,44,55,20]

#bubble
def bubbleSort(arr):
    for i in range(len(arr),0,-1):
        for j in range(i - 1):
            if(arr[j] > arr[j + 1]):
                arr[j+1], arr[j] = arr[j], arr[j+1]

bubbleSort(arr)
print(arr)

C++实现:

void bubbleSort(vector<int>& arr){
	for (int i = arr.size(); i > 0 ; i--){
		for (int j = 0; j < i - 1; j++){
			if (arr[j] > arr[j + 1]){
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

vector<int> arr{ 54, 26, 93, 17, 77, 31, 44, 55, 20 }; 
bubbleSort(arr);
for (int i = 0; i < arr.size(); i++){
	cout << arr[i] << ' ';
}

插入排序算法

通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

python实现:

arr = [54,26,93,17,77,31,44,55,20]


def insertSort(arr):
    for i in range(1, len(arr)): 
        for j in range(i,0,-1):
            if(arr[j - 1] < arr[j]):
                arr[j - 1], arr[j] = arr[j], arr[j - 1]

insertSort(arr)
print(arr)

C++实现:

void insertSort(vector<int>& arr){
	for (int i = 1; i < arr.size(); i++){
		for (int j = i; j >= 1; j--){
			if (arr[j] > arr[j - 1]){
				int temp = arr[j];
				arr[j] = arr[j - 1];
				arr[j - 1] = temp;
			}
		}
	}
}

vector<int> arr{ 54, 26, 93, 17, 77, 31, 44, 55, 20 }; 
insertSort(arr);
for (int i = 0; i < arr.size(); i++){
	cout << arr[i] << ' ';
}

归并排序算法

归并排序的思想就是先递归分解数组,再合并数组。

python实现:

arr = [54,26,93,17,77,31,44,55,20]
def mergeSort(arr):
    if(len(arr) < 2):
        return arr
    mid = int(len(arr)/2)
    l_arr = mergeSort(arr[:mid])
    r_arr = mergeSort(arr[mid:])
    #merge
    result = []
    l, r = 0,0
    while(l < len(l_arr) and r < len(r_arr)):
        if(l_arr[l] < r_arr[r]):
            result.append(l_arr[l])
            l += 1 
        else:
            result.append(r_arr[r])
            r += 1
    result += l_arr[l:]
    result += r_arr[r:]
    return result

arr = mergeSort(arr)
print(arr)

C++实现

void mergeSort(vector<int>& arr, int start, int end ){
	if (end - start < 1){
		return ;
	}
	int mid = start + (end - start) / 2;
	mergeSort(arr, start, mid);
	mergeSort(arr, mid + 1, end);
    //merge
	int left = start;
	int right = mid + 1;
	vector<int> temp; 
	while (left <= mid && right <= end){
		if (arr[left] < arr[right]){
			temp.push_back(arr[left++]);
		}
		else{
			temp.push_back(arr[right++]); 
		}
	}
	while (left <= mid){
		temp.push_back(arr[left++]); 
	}
	while (right <= end){
		temp.push_back(arr[right++]); 
	} 
	for (int i = start; i <= end; i++){
		arr[i] = temp[i - start];
	}
}

vector<int> arr{ 54, 26, 93, 17, 77, 31, 44, 55, 20 };
mergeSort(arr, 0, arr.size() - 1);
for (int i = 0; i < arr.size(); i++){
	cout << arr[i] << ' ';
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值