linux c排序算法

一、冒泡排序

基本思想:比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放到数组后面。

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int i, j, num[8] = {0};
	printf("please input eight number:  ");
	for( i = 0; i < 8; i++){
		scanf("%d", &num[i]);
	}
	for( i = 0; i < 8; i++){
		printf("%d\t", num[i]);
	}
	for (j = 7; j > 0; j-- ){
		for ( i = 0; i < j; i++){
			if ( num [i] > num[i+1] ){
				num[i] ^= num[i+1];
				num[i+1] ^= num[i];
				num[i] ^= num[i+1];
			}
		}
	}
	putchar('\n');
	for( i = 0; i < 8; i++){
		printf("%d\t", num[i]);
	}

	return 0;
}
#include<stdio.h>
//升级版冒泡排序算法
void bubbleSort_1(int *arr, int n) {
    //设置数组左右边界
    int left = 0, right = n - 1;
    //当左右边界未重合时,进行排序
    while (left<=right) {
        //从左到右遍历选出最大的数放到数组右边
        for (int i =left; i < right; i++)
        {
            if (arr[i] > arr[i + 1])
            {
                int temp = arr[i]; 
                arr[i] = arr[i + 1]; 
                arr[i + 1] = temp;
            }
        }
        --right;
        //从右到左遍历选出最小的数放到数组左边
       for (int j = right;j> left; j--)
        {
            if (arr[j] < arr[j-1])
            {
                int temp = arr[j]; 
                arr[j] = arr[j - 1]; 
                arr[j - 1] = temp;
            }
        }
        
        ++left;
    }

}
int main() {
    int arr[] = { 10,54,5,2,3,8,7,4,9,1 };
    int n = sizeof(arr) / sizeof(int);
    bubbleSort_1(arr, n);
    printf("排序后的数组为:\n");
    for (int j = 0; j<n; j++)
        printf("%d ", arr[j]);
    printf("\n");
    return 0;
}

二、选择排序

基本思想:依次选出数组最小的数放到数组的前面。首先从数组的第二个元素开始往后遍历,找出最小的数放到第一个位置。再从剩下数组中找出最小的数放到第二个位置。以此类推,直到数组有序

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, j, num[8] = {0}, max, index;
	printf("please input eight number:  ");
	for( i = 0; i < 8; i++){
		scanf("%d", &num[i]);
	}
	for( i = 0; i < 8; i++){
		printf("%d\t", num[i]);
	}
    for(j = 7; j > 0; j--){
        max = 0;
        for(i = 0; i <= j; i++)
        {
            if(max < num[i]){
                max = num[i];
                index = i;
            }
        }
        /*num[j] ^= num[index];//这方法把相同的数会成0
        num[index] ^= num[j];
        num[j] ^= num[index];*/
        num[index] = num[j];
        num[j] = max;
    }
    putchar('\n');
    for( i = 0; i < 8; i++){
		printf("%d\t", num[i]);
	}

    return 0;
}

三、插入排序

基本思想:和交换排序不同的是它不用进行交换操作,而是用一个临时变量存储当前值。当前面的元素比后面大时,先把后面的元素存入临时变量,前面元素的值放到后面元素位置,再到最后把其值插入到合适的数组位置。

#include <stdio.h>
//自定义的输出函数
void print(int a[], int i)
{
    printf("%d:\t",i);
    for(int j=0; j<8; j++)
    {
        printf("%d \t",a[j]);
    }
    printf("\n");
}
//直接插入排序函数
void InsertSort(int a[], int n)
{
    for(int i= 1; i<n; i++)
    {
        if(a[i] < a[i-1])
        {//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。
            int j= i-1;
            int x = a[i];
            while(j>-1 && x < a[j])
            {  //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间
                a[j+1] = a[j];
                j--;
            }
            a[j+1] = x;      //插入到正确位置
        }
        print(a,i);//打印每次排序后的结果
    }
}
int main()
{
    int a[8] = {3,1,7,5,2,4,9,6};
    InsertSort(a,8);
    return 0;
}

四、快速排序

基本思想:选取一个基准元素,通常为数组最后一个元素(或者第一个元素)。从前向后遍历数组,当遇到小于基准元素的元素时,把它和左边第一个大于基准元素的元素进行交换。在利用分治策略从已经分好的两组中分别进行以上步骤,直到排序完成。下图表示了这个过程。

#include <stdio.h>
#include <stdlib.h>

void swap(int *num1, int *num2){
    int temp;
    temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}

int zone(int *a, int left, int right){
    int j = left;
    int i = j - 1;
    int key = a[right];
    for(; j < right; j++){
        if(a[j] < key){
            swap(&a[j], &a[++i]);
        }
    }
    swap(&a[right], &a[++i]);

    return i;
}

void quicksort(int *a, int left, int right){
    if (left >= right){
        return;
    }
    int mid = zone(a, left, right);
    quicksort(a, left, mid - 1);
    quicksort(a, mid + 1, right);
}

int main()
{
    int i = 0;
    int a[12] = {89, 5, 56, 23, 54, 67, 90, 68, 2, 46, 7, 8};
    int n = sizeof(a) / sizeof(int);
    quicksort(a, 0, n - 1);
    printf("排序后数据:");
    for(; i < n; i++ ){
        printf("%d\t", a[i]);
    }

    putchar('\n');

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值