您的位置:首页 > 其它

几种常见的排序算法

2017-02-28 18:27 106 查看
//交换两个值
void swap(int *a,int *b){
    int temp ;
    temp= *a;
    *a = *b;
    *b = temp;
}

1、//冒泡排序
void bubblesort(int a[],int n){
    int temp;
    for (int i=0; i<n-1; i++) {
        for (int j=0; j<n-1-i; j++)
{
            if (a[j]>a[j+1]) {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
}
/**
 冒泡排序
冒泡排序为一个循环内的两两比较,外层每比较一轮,则会出现一个最大值或者最小值,总共比较的轮次为n-1轮,而内层循环a[j]>a[j+1],但是当外层比较一轮就会出现一个最小值或最大值,也就是说会减少一轮,因此需要减掉外层的比较次数 i,
 */

2、//选择排序
void selectSort(int a[],int n){
    int temp;
    for(int i=0;i<n-1;i++){
        temp = i;
        for (int j=i+1; j<n; j++) {
            if (a[temp]<a[j]) {
                temp = j;
            }
        }
        if (temp!= i) {
            swap(&a[temp], &a[i]);
        }
    }
}
/**
 选择排序
 选择排序为两个层级,外层获取一个索引值的数与内层的所有数据进行依依比较,同样外层每比一次就会出现一个最大值或者最小值,因此内层的起始值需要为 i + 1 ,
 */

3、//插入排序
void insertsort(int arr[],int n){
    for(int i =
1;i < n; i ++){
        if(arr[i] < arr[i-1]){//注意[0,i-1]都是有序的。如果待插入元素比arr[i-1]还大则无需再与[i-1]前面的元素进行比较了,反之则进入if语句
            int temp = arr[i];
            int j;
            for(j = i-1; j >=
0 && arr[j] > temp; j --){
                arr[j+1] = arr[j];//把比temp大或相等的元素全部往后移动一个位置
            }
            printf("%d\n",j);
            arr[j+1] = temp;//把待排序的元素temp插入腾出位置的(j+1)
        }
    }
}
/**
 插入排序
 插入排序为依次进行比较,当后面的数值与前面已排好的数值依次进行比较,若小于,则将前面排好的数值往后挪一个位置,再将当前的数值插入空出的位置中。
 */

4、//快速遍历
void sort(int *a,
int left, int right)
{
    if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[left];
    
    while(i < j)                              
/*控制在当组内寻找一遍*/
    {
        while(i < j && key <= a[j])
        /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
         序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
        {
            j--;/*向前寻找*/
        }
        
        a[i] = a[j];
        /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
         a[left],那么就是给key)*/
        
        while(i < j && key >= a[i])
        /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
         因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
        {
            i++;
        }
        
        a[j] = a[i];
    }
    
    a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
    sort(a, left, i -
1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
    sort(a, i +
1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
    /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: