A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Blake 初级黑马   /  2014-7-5 23:44  /  1217 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

4种面试中常见的排序方法
一:冒泡排序:
思路:相邻两个元素之间的比较。例如将一数组按从小到大排列:第一轮两个元素相比较,将数组中最大的元素放到数组的最末尾;第二轮两个元素相比较,将数组中次大的元素放到数组的倒数第二位,此时不用和最后一个元素相比较了;第三轮两个元素相比较,将第三大的元素放在数组的倒数第三的位置上,此时也不用比较和倒数第二个数和倒数第一个数相比较了;然后依次类推得出结果。
代码:
void bubblesort(int a[], int len) {
        int i, j;
        for (i = 1; i < len; ++i) {
                for (j = 0; j < len - i; ++j) {
                        if (a[j] > a[j + 1]) {
                                int k = a[j];
                                a[j] = a[j + 1];
                                a[j + 1] = k;
                        }
                }
        }
}

二:选择排序
思路:两个元素相比较,注意不一定是相邻的元素哦!例如将一数组从小到大排列,第一轮先找到最大的元素然后和数组最后一个元素相交换;第二轮找到次大的数与数组倒数第二个元素相交换,以此类推....
代码:
void selcetsort(int a[], int len) {
        int i, j, max,t = 0;
        for (i = 1; i < len; ++i) {
                max = len - i;
                for (j = 0; j < len - i; ++j) {
                        if (a[j] > a[max]) {
                                max = j;
                        }
                }
                        if (max !=len - i) {
                                t = a[j];
                                a[j] = a[max];
                                a[max] = t;
                        }
        }
}
三:插入排序
思路:第一轮以下标为1的元素为基准,将前面的元素与此基准相比较;第二轮以下标为2的元素为基准,将前面的元素与此基准相比较;以此类推。
代码:
void insertsort(int a[], int len) {
        int i, j, k;
        for (i = 1; i < len; ++i) {
                k = a[i];
                for (j = i; j > 0; --j) {
                        if (a[j - 1] > k) {
                                a[j] = a[j - 1];
                        } else
                                break;
                        a[j - 1] = k;
                }
        }
}

四:快速排序
思路:第一轮排序:1)先以首元素为基准,假设首元素npivot=14,设定两个指针指向i,j分别指向数组的首尾元素;2)向前移动指针j直到指向第一个小于14的元素,并将此元素置换到i所指向的位置;3)向后移动指针i直到指向第一个大于14的元素,并将此元素置换到j所指向的位置;4)然后继续执行2)3),当i==j时,则将14放在i或j的位置上;然后后面的几轮排序则使用递归的方式继续
int quickoncesort(int a[],int low,int high){//第一轮排序
        int i=low,j=high,npivot=a[low];
        while(i<j){
                while(i<j&&a[j]>=npivot){
                        --j;
                }
                a[i]=a[j];
                while(i<j&&a[i]<=npivot){
                        ++i;
                }
                a[j]=a[i];
        }
        a[i]=npivot;
        return i;
}

void quicksort(int a[],int low,int high){//以后用递归的方式来排序
        if(low>=high)return;
        int npivotindex=quickoncesort(a,low,high);
        quicksort(a,low,npivotindex-1);
        quicksort(a,npivotindex+1,high);
}


int main() {//主函数
        int a[10] = { 9, 5, 7, 3, 6, 4 };
        //        bubblesort(a,6);
//        insertsort(a, 6);
        quicksort(a,0,5);
        int i;
        for (i = 0; i < 6; ++i) {
                printf("%d", a[i]);
        }
        return 0;
}

2 个回复

倒序浏览
支持一下
回复 使用道具 举报
路过,顶一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马