zoukankan      html  css  js  c++  java
  • 几种常见的排序方法(C语言实现)

    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>
    
    //直接插入排序
    void InsertSort(int arry[], int n)
    {
        int i, j;
        int temp;//临时变量
        for (i = 1; i < n; i++)
        {
            temp = arry[i];
            for (j = i - 1; j >= 0; j--)
            {
                if (temp > arry[j])
                    break;
                else
                    arry[j + 1] = arry[j];
            }
            arry[j+1] = temp;
        }
    }
    
    //直接选择排序
    void SelectSort(int arry[], int n)
    {
        int i, j;
        int temp;
        for (i = 0; i < n-1; i++)
        {
            temp = i;
            for (j = i + 1; j < n; j++)
            {
                if (arry[j] < arry[temp])
                    temp = j;
            }
            if(temp!=i)
                arry[temp] ^= arry[i] ^= arry[temp] ^= arry[i];//实现arry[temp]和arry[i]值交换
        }
    }
    
    //冒泡排序
    void BubbleSort(int arry[], int n)
    {
        int i, j, k;
        for (i = 0; i < n-1; i++)
        {
            for (j = i; j < n; j++)
            {
                if (arry[j - 1]>arry[j])
                    arry[j - 1] ^= arry[j] ^= arry[j - 1] ^= arry[j];//实现arry[temp]和arry[i]值交换
            }
        }
    }
    
    //希尔排序第一类,
    void ShellSort1(int arry[], int n)
    {
        int i, j, k, gap,temp;
        for (gap = n / 2; gap > 0; gap /= 2)
        {
            for (k = 0; k < gap; k++)//同组先排
            {
                for (i = k+gap; i < n; i += gap)
                {
                    temp = arry[i];
                    for (j = i - gap; j >= 0; j -= gap)
                    {
                        if (temp > arry[j])
                            break;
                        else
                            arry[j + gap] = arry[j];
                    }
                    arry[j + gap] = temp;
                }
            }
        }
    }
    
    //希尔排序第二类
    void ShellSort2(int arry[], int n)
    {
        int i, j, k, gap, temp;
        for (gap = n / 2; gap > 0; gap /= 2)
        {
            for (i = gap; i < n; i++)//所有组一起排序
                {
                    temp = arry[i];
                    for (j = i - gap; j >= 0; j -= gap)
                    {
                        if (temp > arry[j])
                            break;
                        else
                            arry[j + gap] = arry[j];
                    }
                    arry[j + gap] = temp;
                }        
        }
    }
    
    //希尔排序,利用gap分组后采用冒泡方式排序
    void ShellSort3(int arry[], int n)
    {
        int i, j, k, gap, temp;
        for (gap = n / 2; gap > 0; gap /= 2)
        {
            for (k = 0; k < gap; k++)
            {
                for (i = k; i < n-gap; i += gap)
                {
                    for (j = k+gap; j <n ; j += gap)
                    {
                        if (arry[j - gap]>arry[j])
                            arry[j - gap] ^= arry[j] ^= arry[j - gap] ^= arry[j];
                    }
                    
                }
            }
        }
    }
    
    //快速排序,递归调用
    void QuickSort(int arry[], int s,int t)
    {
        int i, j;
    
        if (s < t)
        {
            i = s;
            j = t+1;
            while (1)
            {
                do
                {
                    i++;
                }while (!(arry[s] <= arry[i] || i >= t));
                do
                {
                    j--;
                } while (!(arry[s] >= arry[j] || j <= s));
                
                if (i < j)
                    arry[i] ^= arry[j] ^= arry[i] ^= arry[j];
                    
                else
                    break;
            }
            if (arry[j]!= arry[s])
                arry[j] ^= arry[s] ^= arry[j] ^= arry[s];
            QuickSort(arry, s, j-1);
            QuickSort(arry, j + 1, t);
        }
    }
    
    int main()
    {
        int arry1[15] = { 19,15,13,10,3,30,23,76,5,16,7,30,32,2,41};
        int arry2[15] = { 19,15,13,10,3,30,23,76,5,16,7,30,32,2,41 };
        int arry3[15] = { 19,15,13,10,3,30,23,76,5,16,7,30,32,2,41 };
        int arry4[15] = { 19,15,13,10,3,30,23,76,5,16,7,30,32,2,41 };
        int arry5[15] = { 19,15,13,10,3,30,23,76,5,16,7,30,32,2,41 };
        int arry6[15] = { 19,15,13,10,3,30,23,76,5,16,7,30,32,2,41 };
        int arry7[15] = { 19,15,13,10,3,30,23,76,5,16,7,30,32,2,41 };
        
        //七种方法任选一种,但效率有别
        //一般情况下:快速排序>直接插入>直接选择==冒泡
        //希尔排序看情况而定。一般优于直接选择排序
    
        //InsertSort(arry1, 15);
        
        //SelectSort(arry2, 15);
        
        //BubbleSort(arry3, 15);
        
        //ShellSort1(arry4, 15);
        //ShellSort2(arry5, 15);    
        //ShellSort2(arry6, 15);
        
        //QuickSort(arry7,0,14);
        
    
    
        int i = 0;
        for (i = 0; i < 15; i++)
        {
            printf("%d  ", arry7[i]);
        }
    
        system("pause");
    }
  • 相关阅读:
    JAVA中的注解小结
    终结任务
    共享资源访问
    基本线程机制
    HashSet、LinkedHashSet、TreeSet
    EnumMap
    LinkedHashMap及其源码分析
    集合迭代器快速失败行为及CopyOnWriteArrayList
    LinkedList
    比特币中的Base58 编码
  • 原文地址:https://www.cnblogs.com/cjw1115/p/4614388.html
Copyright © 2011-2022 走看看