前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >排序算法

排序算法

原创
作者头像
子建
修改2020-10-09 15:55:17
3290
修改2020-10-09 15:55:17
举报

Sort

需要注意的是,sort对一般数组排序 sort(A,A+100);即可

但是对于vector需要使用 a.begin() 来获取其指针。

代码语言:txt
复制
sort(money.begin()+1,money.end(),cmp); 

选择排序

找出最小的和首位交换...

代码语言:txt
复制
void selectSort(int a[],int N){
	for(int i=0;i<N-1;i++){
		min=i;
		for(int j=i+1;j<N;j++)
			if(A[j]<A[min])
				min=j;
		swap(a[i], a[min]);
		
	}
}

插入排序

插入排序。注意,若后面一个元素比其前面一个元素小,则将这两个元素交换位置,指向左移一位然后再来比较这个元素与前面一个元素的大小,若小,则还需要交换这两个元素位置,一直到这个插入元素在正确的位置为止

代码语言:txt
复制
void insertSort(int a[],  int length)
{
	for (int i = 1; i < length; i++){
		for (int j = i - 1; j >= 0 && a[j + 1] < a[j]; j--)
			swap(a[j], a[j + 1]);
	}
}

冒泡排序

代码语言:txt
复制
void BubbleSort(int a[],int N){
    bool flag;
    for(int i=N-1;i>=0;i--){
    flag=false;
		for(int j=0;j<i;j++){
		if(a[j]>a[j+1]){
			swap(a[j],a[j+1]);
			flag=true;
		}
    }
    if(flag==false) break;
}

归并排序

代码语言:txt
复制
void MergeSort (int arr [], int low,int high) {
    if(low>=high) { return; } // 终止递归的条件,子序列长度为1
    int mid =  low + (high - low)/2;  // 取得序列中间的元素
    MergeSort(arr,low,mid);  // 对左半边递归
    MergeSort(arr,mid+1,high);  // 对右半边递归
    merge(arr,low,mid,high);  // 合并
  }
代码语言:txt
复制
void Merge(int arr[],int low,int mid,int high){
    //low为第1有序区的第1个元素,i指向第1个元素, mid为第1有序区的最后1个元素
    int i=low,j=mid+1,k=0;  //mid+1为第2有序区第1个元素,j指向第1个元素
    int *temp=new int[high-low+1]; //temp数组暂存合并的有序序列
    while(i<=mid&&j<=high){
        if(arr[i]<=arr[j]) //较小的先存入temp中
            temp[k++]=arr[i++];
        else
            temp[k++]=arr[j++];
    }
    while(i<=mid)//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
        temp[k++]=arr[i++];
    while(j<=high)//同上
        temp[k++]=arr[j++];
    for(i=low,k=0;i<=high;i++,k++)//将排好序的存回arr中low到high这区间
	arr[i]=temp[k];
    delete []temp;//释放内存,由于指向的是数组,必须用delete []
}
代码语言:txt
复制
void sort(int a []){
    int N = a.size();
    for (int size = 1; size < N; size *= 2){
      //  low+size=mid+1,为第二个分区第一个元素,它 < N,确保最后一次合并有2个区间
      for(int low = 0; low + size < N;low += 2 * size) {
        mid = low + size - 1;
        high = low + 2 * size - 1;
        if(high > N-1) high = N - 1;
        merge(a,low, mid, high);
      }
    }
  }

+++

二分插入排序

二分法插入排序,简称二分排序,是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left<right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Sort
  • 选择排序
  • 插入排序
  • 冒泡排序
  • 归并排序
  • 二分插入排序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档