排序1

冒泡: 
for(int i=0;i<n;i++){
	for(int j=i+1;j<n;j++){
		if(a[j-1] > a[j]) swap(a[j-1],a[j]);
	}
}
选择:
for(int i=0;i<n;i++){
	int k=i;
	for(int j=i+1;j<n;j++){
		if(a[k] > a[j]) k=j;
	}
	swap(a[i],a[k]);
}
归并:(子问题)
c[n],a[n/2],b[n/2];
int i=0,j=0;
while(i<n&&j<n){
	if(a[i] < b[j]){
		c[i+j] = a[i];
		i++; 
	}
	esle{
		c[i+j] = b[j];
		j++;
	}
}
while(i<n){
	c[i+j] = a[i];
	i++;
}
while(j<n){
	c[i+j] = b[j];
	j++;
}
归并:(完整)
#include<stdio.h>
int temp[100];
void verge(int* a, int len_a, int* b , int len_b, int *c)
{
	int i=0,j=0;
	while(i<len_a && j<len_b){
		if(a[i] < b[j]){
			c[i+j] = a[i];
			i++; 
		}
		else{
			c[i+j] = b[j];
			j++;
		}
	}
	while(i<len_a){
		c[i+j] = a[i];
		i++;
	}
	while(j<len_b){
		c[i+j] = b[j];
		j++;
	} 
}
void sort(int* a,int len)
{
	if(len == 1) return;
	int mid=len/2;
	sort(a,mid);
	sort(a+mid,len-mid);
	verge(a,mid,a+mid,len-mid,temp);
	for(int i=0;i<len;i++)
		a[i]=temp[i];
}
int main()
{
	int n;
	int a[100];
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",a+i); 
	sort(a,n);
	for(int i=0;i<n;i++)
		printf("%d ",a[i]);
	return 0;
}
qsort:
#include <stdio.h>
#define swap(a, b) {int t=a;a=b;b=t;}
#define MAX 1000000 
int a[MAX];
int n;
int location(int *a, int l, int r)
{
    int i = l, j = r, temp = a[l]; //i一定从l开始,才可能在遇到不能交换的情况与自己交换 
    while (1)
    {
        for (; a[j] >= temp && j > i; j--){}//{}是防止出现for嵌套 
        for (; a[i] <= temp && j > i; i++){}//j前i后,因为temp=a[l],j<=temp等于号一定要加防止出现死循环,j>i等于号一定不能加 
        if (j <= i) break;
        swap(a[j], a[i]);
    }
    return j;
}
void qsort(int *a, int l, int r)
{
    if (l >= r) return;
    int k = location(a, l, r);
    swap(a[k], a[l]);
    qsort(a, l, k - 1);
    qsort(a, k + 1, r);
}
int main()
{
    
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", a + i);
    }
    qsort(a, 0, n - 1);
    for (int i = 0; i < n-1; i++)
    {
        printf("%d ", a[i]);
    }
    printf("%d",a[n-1]);
    return 0;
}

如何使用qsort

#include<stdio.h>
using namespace std;
cmp(const void *a, const void *b){
    return //如果返回值是正数就会执行交换命令,在a数组中将前后交换;
    //是负数就不交换
//所以常用*a - *b ,不能用a>b;因为没用负数的情况
}
int main(){
    int a;

    qsort(a,len_a,sizeof(a[0],cmp));
    return 0;
}

如何使用sort(相对来说sort比qosrt更加简便)+unique

#include<stdio.h>
#include<algorithm>
using std::sort;
using std::unique;
int cmp(int a, int b){ //参数不一定要用const void *p1 
	return 0; //与 qsort 不同 return 1 交换0; return 0 不交换;只能有这两种返回值  
}
int main()
{
	int a[10];
	for(int i=0;i<10;i++){
		scanf("%d",a+i);
	}
	sort(a,a+10,cmp); //头地址,尾地址,函数 //先排序,在去重;
        int len = unique(a,a+10) - a;//len是最后一个不重复数字的下标,unique()
//既改变数组的顺序,又有返回值,返回值为重复的数的个数
	for(int i=0;i<len;i++){ //只要输出前面的几个数组元素即可
		printf("%d ",a[i]);
	}
	return 0;
}
posted @ 2023-01-16 15:04  MITE's_BKY  阅读(21)  评论(0)    收藏  举报