八大排序(二)

(一)选择排序
是一种简单直观的排序算法,他的基本原理是:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二轮排序,得到最小的记录并与第二个记录进行位置交换;重负该过程,直到进行比较的记录只有一个为止。代码如下:

 #include <stdio.h>
    int main()
    {
        int arr[] = {23,34,76,98,68,38,79,56,94,18};
        int i, j, temp, len, index, min;
        len = sizeof(arr) / sizeof(int);				//获取待排序列长度
        
        for(i = 0; i < len; i++)
        {
            index = i;											//记录最小值下标
            min = arr[index];								//改变最小值
          
            for(j = i + 1; j < len; j++)					//查找最小值下标
            {
                if(arr[j] < min)
                {
                    min = arr[j];
                    index = j;
                }            
            }
            
            if(i != index)										//最小值交换
            {
                arr[index] = arr[i];
                arr[i] = min;
            }
    
        }
    
        for(i = 0; i < len; i++)						//遍历排序后的数组
        {
            printf("%5d",arr[i]);
        }
        printf("\n");
    
        return 0;
    }

(二)快速排序
基本思想:通过一轮的排序将序列分割成独立的两部分,其中一部分序列的关键字(这里主要用值来表示)均比另一部分关键字小。继续对长度较短的序列进行同样的分割,最后到达整体有序。在排序过程中,由于已经分开的两部分的元素不需要进行比较,故减少了比较次数,降低了排序时间。
基本步骤
1)设置两个变量low、high,排序开始的时候low=0,high=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[1]; 3)从high开始向前搜索,即由后开始向前搜索(high–),找到第一个小于key的值,两者交换;
4)从low开始向后搜索,即由前开始向后搜索(low++),找到第一个大于key的值,两者交换;
5)重复第3、4步,直到low=high;
代码如下:

   #include <stdio.h>
      void quick_sort(int arr[], int low, int up)	
      {
                if(low < up)
                {
                    int temp, left, right;
                    temp = arr[low];
                    left = low;
                    right = up;
            
                    while(left < right)							    //单次循环
                    {
                        while(left < right && temp < arr[right])	//从后向前找到第一个小于关键字的数
                        {
                            right--;
                        }
                        if(left < right)						    //关键字与小于它的数交换
                        {
                            arr[left++] = arr[right];
                        }
            
                        while(left < right && temp > arr[left])		//从前向后查找,找到第一个大于该数的值
                        {
                            left++;
                        }
                        if(left < right)						    //交换
                        {
                            arr[right--] = arr[left];
                        }
                    }
                    arr[left] = temp;								//插入关键字
            
                    quick_sort(arr, low, left - 1);					//左递归
                    quick_sort(arr, left + 1, up);					//右递归
                }
      }
            
       int main()
       {
                int arr[] = {10,4,23,65,78,43,98,54,79,19};
                int len = sizeof(arr) / sizeof(int);
                int i;
            
                printf("排序前:");
                for(i = 0; i < len; i++)
                {
                    printf("%5d",arr[i]);
                }
                printf("\n");
            
                quick_sort(arr, 0, len-1);
            
                printf("排序后:");
                for(i = 0; i < len; i++)
                {
                    printf("%5d",arr[i]);
                }
                printf("\n");
            
                return 0;
       }

(三)冒泡排序
基本概念:若序列有n个数,依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后,此时序列中最大的数被放在最后;再次进行第二趟比较,比较到倒数第二位截止,将第二大的数放在倒数第二位,直至n-1趟比较结束,则排序完成。
代码如下:

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

void maopao_sort(int arr[])
{
    int i, j, temp;
    for(i = 8; i >= 0; i--)						//控制比较轮数
    {
        for(j = 0; j <= i; j++)					//从左向右两两比较
        {
            if(arr[j] > arr[j + 1])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main()
{
    srand((int)time(0));

    int i, j, arr[10];

    for(i = 0; i < 10; i++)				
    {
        arr[i] = rand() % 100;						//数组初始化
    }

    printf("排序前:");
    for(i = 0; i < 10; i++)								//遍历数组
    {
        printf("%4d",arr[i]);
    }
    printf("\n");

    maopao_sort(arr);							//冒泡排序

    printf("排序后:");
    for(i = 0; i < 10; i++)							//遍历数组
    {
        printf("%4d",arr[i]);
    }
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43499599/article/details/88046682