ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

十大排序

2022-07-26 19:35:43  阅读:128  来源: 互联网

标签:sort arr include 十大 int len 排序


十大排序

冒泡排序

#include<stdio.h>
void bubble_sort(int arr[],int len){
	int i,j,temp;
	for(i=0;i<len-1;i++){
		for(j=0;j<len-1-i;j++){
			if(arr[j]>arr[j+1]){
				temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
	}
}
int main(){
	int arr[]={22,34,3,32,82,89,50,37,5,64,35,9,70};
	int len=(int)sizeof(arr)/sizeof(*arr);
	bubble_sort(arr,len);
	int i;
	for(i=0;i<len;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
	return 0;	
}

选择排序

选最小的放在最前面

#include<stdio.h>
void swap(int *a,int *b){
	int temp;
	temp=*a,
	*a=*b;
	*b=temp;
}
void select_sort(int arr[],int len){
	int i,j;
	for(i=0;i<len-1;i++){
		int min=i;
		for(j=i+1;j<len;j++)
		if(arr[j]<arr[min]){
			min=j;
			swap(&arr[min],&arr[i]);
		}
	}
}
int main(){
	
	int arr[]={22,34,3,32,82,89,50,37,5,64,35,9,70};
	int len=(int)sizeof(arr)/sizeof(*arr);
	select_sort(arr,len);
	int i;
	for(i=0;i<len;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
	return 0;	
}

插入排序

插入到已经排好序的之中

#include<stdio.h>
void insertion_sort(int arr[],int len){
	int i,j,key;
	for(i=1;i<len;i++){
		key=arr[i];
		j=i-1;
		while(j>=0&&arr[j]>key){
			arr[j+1]=arr[j];//往右挪动
			j--;
		}
		arr[j+1]=key;
	}
}
int main(){
	
	int arr[]={22,34,3,32,82,89,50,37,5,64,35,9,70};
	int len=(int)sizeof(arr)/sizeof(*arr);
	insertion_sort(arr,len);
	int i;
	for(i=0;i<len;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
	return 0;	
}

希尔排序

归并排序

终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间

1申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序;
2设定两个指针,最初位置分别为两个已经排序序列的起始位置;
3比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动到下一位置;
4重复步骤 3 直到某一指针达到序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾。

#include<stdio.h>
#include<malloc.h>
int min(int x,int y){
	return x<y?x:y;
}
void merge_sort(int arr[], int len) {
    int *a = arr;
    int *b = (int *) malloc(len * sizeof(int));
    int seg, start;
    for (seg = 1; seg < len; seg += seg) {
        for (start = 0; start < len; start += seg * 2) {
            int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
            int k = low;
            int start1 = low, end1 = mid;
            int start2 = mid, end2 = high;
            while (start1 < end1 && start2 < end2)
                b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
            while (start1 < end1)
                b[k++] = a[start1++];
            while (start2 < end2)
                b[k++] = a[start2++];
        }
        int *temp = a;
        a = b;
        b = temp;
    }
    if (a != arr) {
        int i;
        for (i = 0; i < len; i++)
            b[i] = a[i];
        b = a;
    }
    free(b);
}
int main(){
	int arr[]={22,34,3,32,82,89,50,37,5,64,35,9,70};
		int len=(int)sizeof(arr)/sizeof(*arr);
		merge_sort(arr,len);
		int i;
		for(i=0;i<len;i++){
			printf("%d ",arr[i]);
		}
		printf("\n");
	return 0;
}

递归版本

void merge_sort_recursive(int arr[], int reg[], int start, int end) {
    if (start >= end)
        return;
    int len = end - start, mid = (len >> 1) + start;
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;
    merge_sort_recursive(arr, reg, start1, end1);
    merge_sort_recursive(arr, reg, start2, end2);
    int k = start;
    while (start1 <= end1 && start2 <= end2)
        reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
    while (start1 <= end1)
        reg[k++] = arr[start1++];
    while (start2 <= end2)
        reg[k++] = arr[start2++];
    for (k = start; k <= end; k++)
        arr[k] = reg[k];
}

void merge_sort(int arr[], const int len) {
    int reg[len];
    merge_sort_recursive(arr, reg, 0, len - 1);
}

快速排序

1从数列中挑出一个元素,称为 "基准"(pivot);

2重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

3递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

#include<stdio.h>
void quick_sort(int *a,int x,int y)
{
    if(x>=y)
    return ;//不可或缺,不然没有出口
    int i=x;
    int j=y;
    int k=a[i];//
    while(i<j)
    {
        while(i<j&&a[j]>=k)
        j--;
        a[i]=a[j];
        while(i<j&&a[i]<=k)
        i++;
        a[j]=a[i];
    }//i===j
    a[i]=k;
    quick_sort(a,x,i-1);//左边调用函数
    quick_sort(a,i+1,y);//右边调用函数
}
int main()
{
    int a[]={64, 34, 25, 12, 22, 11, 90};
    int n=7;
    quick_sort(a,0,n-1);//n-1**
    for(int i=0;i<n;i++)
    printf("%d ",a[i]);
    return 0;
}

堆排序

计数排序

桶排序

简单的桶排序

#include <bits/stdc++.h>
using namespace std;
void barrelSort()
{   //prepare
    int a[100]={0};
    //handle
    int n;cin>>n;
    for(int i=0;i<n;i++)
    {
        int b; cin>>b;
        a[b]++;
    }
    //output
    for(int i=0;i<100;i++)
    {
        if(a[i]!=0)
        {
            for(int j=0;j<a[i];j++)
            {
                cout<<i<<" ";
            }
        }
    }
}
int main()
{
    barrelSort();
    return 0;
}

//5 5 3 5 2 8  max10; min->max sum=5;
//桶排序

深入优化的桶排序

基数排序

菜鸟教程

标签:sort,arr,include,十大,int,len,排序
来源: https://www.cnblogs.com/firhk/p/16522265.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有