数据结构--排序算法

排序

排序的基本概念:

1.排序定义:

重新排列表中的元素,使表中的元素满足关键字递增或递减。

2.稳定性:

若待排序表中存在关键字的值相等的两个或多个元素,使用某种排序算法后,关键字的值相等的元素之间的相对位置较排序之前相同,则称这个算法是稳定的,否则称这个算法是不稳定的。

内部排序:

指在排序期间元素全部存放在内存中的排序。

  1. 插入排序:每次将一个待排序的序列插入到一个前面已排序好的子序列当中,有这几种插入排序方法:直接插入排序、折半插入排序、希尔排序。
  2. 交换排序:冒泡排序、快速排序
  3. 选择排序:简单选择排序、堆排序
  4. 归并排序
  5. 基数排序

下面是每种排序算法的代码实现
1.直接插入排序算法:
平均时间复杂度:O(log2)、空间复杂度:O(1)、稳定的排序算法、适用于顺序存储和链式存储。

#include<iostream>
using namespace std;

//直接插入排序算法 
void InsertSort(int A[], int n){
   
	int i, j;
	//0位置是哨兵,前1个元素已经排序好,从下标为2的元素开始到最后一个元素依次进行插入排序 
	for(i = 2; i < n; i++){
   
		A[0] = A[i];//A[0]是哨兵,有两个作用:一:用来保存待排序的元素关键字 二:当在从已排序好的最后一个元素向前比较时,可以保证不会越界 
		//从已排序好的最后一个元素开始比较大小,若最后一个元素大于要排序的元素,则最后一个元素后移一个单位,
		//然后与最后一个元素的前一个元素比较,直到出现某个元素小于等于要排序的元素,说明待排序的元素要排在这个元素后面,则直接把待排序元素放在这个元素后面 
		for(j = i - 1; A[0] < A[j]; j--){
   
			A[j + 1] = A[j];
		}
		A[j + 1] = A[0];
	}
}
	
int main(){
   
	int arr[] = {
   0,9,8,7,6,5,4,3,2,1};//第一位是哨兵,随便什么数字 
	int len = sizeof(arr) / sizeof(int);//数组长度 
	//输出排序前的数组 
	for(int i = 1; i < len; i++){
   
		cout<<arr[i]<<endl;
	}
	cout<<endl; 
	InsertSort(arr, len);
	//输出排序后的数组 
	for(int i = 1; i < len; i++){
   
		cout<<arr[i]<<endl;
	}
	return 0;
}

2.折半插入排序算法:
平均时间复杂度:O(n^2),需要插入n - 1个元素,其中折半查找的时间复杂度为O(log2n),移动的时间复杂度为O(n)、空间复杂度:O(1)、稳定的排序算法,只适用于顺序存储。

#include<iostream>
using namespace std;

//折半插入排序算法-n是数组长度 
void BInsertSort(int A[], int n){
   
	int i, j;
	int low, high, mid;
	//0位置是哨兵,前1个元素已经排序好,从下标为2的元素开始到最后一个元素依次进行插入排序 
	for(i = 2; i < n; i++){
   
		A[0] = A[i];//A[0]是哨兵
		
		low = 1; high = i - 1;
		while(low <= high){
   
			mid = (low + high) / 2;
			if(A[mid] > A[0]){
   
				high = mid - 1;
			}
			else{
   
				low = mid + 1;
			}
		}
		
		for(j = i - 1; j >= low; j--){
   
			A[j + 1] = A[j];
		}
		A[j + 1] = A[0];
	}
}

int main(){
   
	int arr[] = {
   0,9,8,7,6,5,4,3,2,1};//第一位是哨兵,随便什么数字 
	int len 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值