冒泡:
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;
}