c语言的几种排序方式(1)

虽然用qsort(c)或者sort(c++)很方便,但做题时候,难免遇到需要用排序算法的情况,排序算法除了桶排序等,其余大多是利用数据的逆序对来排序,而桶排序是利用数据本来的顺序。以下下是利用比较大小来排序的,这种类型还有一个希尔排序没有提到,将添加后面不用比较大小的内容。

一,冒泡排序
 

所谓冒泡,就想鱼吐泡泡,从小往大,交换相邻两个

c语言的几种排序方式(1)_第1张图片

每一次循环,比较两个数的大小,都会将大的放在上面,小的放在下面,每次循环过后,最大的都会再顶端(因为大的是一直往上交换的), 最终实现从小到大排序。

时间复杂度为O(n^2),较大

代码如下

#include
using namespace std;
int arr[100];
int n;
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	for (int i = 0; i < n-1 ; i++) {
		for (int j = 0; j < n - 1 - i; j++) {
			if (arr[j] > arr[j+1]) {
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		cout << arr[i] << " ";
	}
	return 0;
}

第一个for循环是表示遍历的次数,因为每次遍历,最大 的都会成功在最上面,因此只要遍历n-1次数。

第二个循环是用来判断相邻的两个数大小,交换大小,每次遍历完成,最上面都要减一个数不用遍历所以要减去n,减一是为了防止溢出。

二,选择排序

将第一个数与后面的数比较大小,然后交换两个数的位置,如何交换,要看题目要求,看需要的排列方式

c语言的几种排序方式(1)_第2张图片

j向右边移动c语言的几种排序方式(1)_第3张图片

遇到比arr[i]小的就交换,从而实现,逐步将最小的放在最后

#include
#include
using namespace std;
int arr[100];
int n;
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	for(int i=0;i

 同样,第一个循环,是遍历整个数组。

第二个循环是寻找每次剩余数组中最小的数,然后与i对应的数交换。

三,插入排序

选择第一个数为初始,与后面的数比较,按照要求插入位置

c语言的几种排序方式(1)_第4张图片

c语言的几种排序方式(1)_第5张图片

c语言的几种排序方式(1)_第6张图片

最终形成有序数组

#include
using namespace std;
int arr[100];
int n;
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
    }
	for(int i=1;i=0 && arr[j]>key){
            arr[j+1]=arr[j];
            //要注意这里是j+1,而不是key
            //交换一次后,该数还要与前面的数字比较,从而形成有序数。
            arr[j]=key;
            j--;
        }
    }
	for (int i = 0; i < n; i++) {
		cout << arr[i] << " ";
	}
	return 0;
}

 这样两次循环,创造一个新的空间来存放是不是也算,找到最小的存进去,是不是也算插入?

#include
#include
using namespace std;
int arr[100];
int brr[100];
int n;
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
    }
	for(int i=0;iarr[j]){
              flag=j;
             }
        }   
        brr[i]=arr[flag];
        arr[flag]=INT_MAX;
    }
	for (int i = 0; i < n; i++) {
		cout << brr[i] << " ";
	}
	return 0;
}

三,归并排序

利用了递归的思想,将数据分为两半,在分别对半进行排序,最后用合在一起

c语言的几种排序方式(1)_第7张图片

由于i指向的数小,所以i向右边移动

c语言的几种排序方式(1)_第8张图片由于j指向的数小,所以j向右边移动

c语言的几种排序方式(1)_第9张图片重复进行此操作,直到两方都结束,若一方提前结束,只需移动未结束的指针

#include
#include
using namespace std;
int n;
int arr[1000];
int brr[1000];
void is_sort(int l,int r,int mid){//合并
    int p=l,q=mid+1;
    for(int i=l;i<=r;i++){
        if(q>r||(p<=mid&&arr[p]>n;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    my_sort(1,n);
    for(int i=1;i<=n;i++){
        cout<

时间复杂度O(n*log2 n)

四,快速排序

字如其名,和他的名字一样,就是排的很快,c中的qsort,和c++中的sort函数就是利用了快速排序

这里给大家分享b站的视频讲解思路,我觉得超详细,可以看看前面的物理演示的思路,我就不画图了

【全网最清晰快速排序,看完快排思想和代码全部通透,不通透你打我!】https://www.bilibili.com/video/BV1vP411g7J3?vd_source=2fcf7367e8561bbd9bb9fedd353732e5

 快速排序也利用了递归的思想,巧妙利用了基准和双指针,刚学排列的时候看过,当时没写出来。

视频里的是以首元素为基准,我这里写的是以中间元素为基准,代码中有标注。

#include
#include
using namespace std;
int arr[1000];
int n;
void quick_sort(int l,int r){
    int i=l,j=r;
    int mid=(l+r)/2;
    while(i<=j){
        if(arr[i]arr[mid]) j--;//找到右边第一个比基准小的数
        if(i<=j){//不能少,不然会超时
            int temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
            i++,j--;//交换后指针要自动指向下一位
        }
    }
    if(l>n;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    quick_sort(1,n);
    for(int i=1;i<=n;i++){
        cout<

制作不易,求个三连

c语言的几种排序方式(1)_第10张图片

你可能感兴趣的:(c语言,c语言,数据结构,开发语言)