初等排序——Insertion Sort & Bubble Sort(2018.7.27)

Insertion Sort(插入排序法)

伪代码:

insertionSort(A, N)
  for i 从 1 到 N-1
     v = A[i]
     j = i - 1
     while j >= 0 且 A[j] > v
       A[j+1] = A[j]
       j--
     A[j+1] = v

插入法排序过程中,会将数组分为已排序部分和未排序部分。

1.将开头元素视为已排序

2.执行下述过程,直到未排序部分消失:

    (1)取出未排序部分赋值给变量v;

    (2)在已排序部分,将所有比v大的元素向后移动一个单位;

    (3)将已取出的元素v插入空位。

实现插入排序法的主要变量:

A[N]长度为N的整型数组
i循环变量,表示未排序部分开头元素
v临时储存A[i]值的变量
j循环变量,用于在已排序部分寻找v的插入位置

两层循环:

外层循环:外层使 i 从 1 开始自增,以遍历数组中的每一个元素,每次循环将A[ i ]存入临时变量 v 中。

内层循环:从已排序部分找出比 v 大的元素,并让其一次后移一位。这里,让 j 从 i - 1 开始自减,以便从大到小遍历已排序部分。将A[ j ]移动到A[j + 1]。一旦 j == -1 或者当前A[ j ]小于等于 v 则循环结束,并将 v 插入 j + 1 位置。

AOJ例题: ALDS1_1_A:Insertion Sort

代码实现:

#include<cstdio>
#include<iostream>
using namespace std;
int N;
const int MAX_SIZE = 101;
int arr[MAX_SIZE];
void trace(int arr[], int N){
	for(int i = 0; i < N ; i++){
		if(i > 0) printf(" ");
		printf("%d",arr[i]);
	}
	printf("\n");
}
void insertionSort(int arr[], int N){
	for(int i = 1; i < N; i++){
		int v = arr[i];
		int j = i - 1;
		while(j >= 0 && arr[j] > v){
			arr[j+1] = arr[j];
			j--;
		}
		arr[j+1] = v;
		trace(arr,N);
	}
} 
int main(){
	scanf("%d",&N);
	for(int i = 0; i < N; i++){
		scanf("%d",&arr[i]);
	}
	trace(arr,N);
	insertionSort(arr,N);
	return 0;
}

 

Bubble Sort(冒泡排序法)

伪代码:

bubbleSort(A, N)//包含N个元素的0起点数组A
  flag = 1      //存在顺序相反的相邻元素
  while flag 
    flag = 0
    for j 从 N-1 到 1
      if A[j] < A[j - 1]
        A[j] 与 A[j - 1] 交换
        flag = 1
      

冒泡排序法依然将数组分为已排序部分和未排序部分。

重复执行下述处理,直到数组中不包含顺序相反的相邻元素:

从数组末尾开始依次比较相邻的两个元素,如果大小关系相反则交换位置。

冒泡排序法的实现(改进):

bubbleSort()
  flag = 1
  i = 0 //未排序部分的起始下标
  while flag
    flag = 0
    for j 从 N-1 到 i+1
      if A[j] < A[j - 1]
        A[j] 与 A[j - 1] 交换
        flag = 1
    i++

实现冒泡排序法的主要变量:

A[N]长度为N的整型数组
i循环变量,表示未排序部分的开头元素,从数组开头向末尾移动
j

循环变量,用于对未排序部分中的相邻元素两两比较,

从A的末尾N-1开始,减少到N-1结束

外部循环每进行一次,已排序部分就增加一个元素,同时未排序部分减少一个元素。

AOJ例题:ALDS1_2_A:Bubble Sort

代码实现:

#include<iostream>
using namespace std;

//使用flag的冒泡排序法
int bubbleSort(int arr[],int N){
	int sw = 0;//记录次数 
	bool flag = 1;
	for( int i = 0; flag ; i++){
		flag = 0;
		for(int j = N - 1; j >= i + 1; j--){
			if(arr[j] < arr[j - 1]){
				swap(arr[j], arr[j - 1]);
				flag = 1;
				sw++;
			}
		}
	}
	return sw; 
} 
int main(){
	int arr[100], N, sw;
	cin >> N;
	for(int i = 0; i < N; i++){
		cin >> arr[i];
	}
	sw = bubbleSort(arr, N);
	for(int i = 0; i < N; i++){
		if(i) cout << " ";
		cout << arr[i];
	}
	cout << endl;
	cout << sw << endl;
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值