C語言中的常見排序

來源:互聯網
上載者:User

1、冒泡排序

#include "stdio.h"void bubble_sort(int arr[],int n){    int i,j,temp;    for(i=0; i<n-1; i++)    {        for(j=0; j<n-i-1; j++)        {            if(arr[j]>arr[j+1])            {                temp=arr[j];                arr[j]=arr[j+1];                arr[j+1]=temp;            }         }    }    return ;}

  對於如上的冒泡排序,如果在第一層迴圈完成之前,數組中所有的資料已經完成了排序,這時就需要進行改進,改進的具體代碼如下:

#include "stdio.h"void bubble_sort(int arr[],int n){    int i,j,flag,temp;    for(i=0; i<n-1; i++)    {        flag=1;        for(j=0; j<n-i-1; j++)        {            if(arr[j]>arr[j+1])            {                temp=arr[j];                arr[j]=arr[j+1];                arr[j+1]=temp;                flag=0;            }            if(1==flag) break;// 跳出最近的一層迴圈        }    }    return ;}

 

2、選擇排序

依次以每個數為基準,與它後面的數進行比較,並將最小的數與它進行交換。這樣可以保證基準和基準以前的數都為有序數。

#include "stdio.h"void choose_sort(int a[],int n){    int i,j,k,temp;    for(i=0; i<n-1; i++)    {        k=i;        for(j=i+1; j<n; j++)        {            if(a[j]<a[k])            {                k=j;            }            if(k!=i)            {                temp=a[i];                a[i]=a[k];                a[k]=temp;            }        }    }}

 

3、快速排序

 

#include "stdio.h"#define N 6
// 進行基準的劃分int partition(int arr[],int low,int hight){    int key;    key=arr[low];// 儲存了最基準的數,所以可以隨便覆蓋    while(low<high)    {        while(low<high&&arr[high]>=key) high--;        if(low<high) arr[low++]=arr[high];        while(low<high&&arr[low]<=key) low++;        if(low<high) arr[high--]=arr[low];    }    arr[low]=key;    return low;}void quick_sort(int arr[],int start,int end){    int pos;    if(start<end)    {        pos=partition(arr,start,end);        quick_sort(arr,start,pos-1);        quick_sort(arr,pos+1,end);// 遞迴進行排序    }    return ;}

 

4、歸併排序

歸併排序的基本思想是將待排序序列分為兩個部分,依次對分得的兩個部分再次使用歸併排序,之後再對其進行合并。

#include "stdio.h"void merge(int arr[],int low,int mid; int high){    int i,k;    int *temp=(int *)malloc((high-low+1)*sizeof(int));// 申請空間    int left_low=low;    int left_high=mid;    int right_low=mid+1;    int right_high=high;    // 比較兩個指標所指向的元素    for(k=0; left_low<=left_high&&right_low<=right_high; k++)    {        if(arr[left_low]<=arr[right_low])        {            temp[k]=arr[left_low++];        }        else            {                temp[k]=arr[right_low++];            }        }    // 如果第一個序列有剩餘,直接複製出來粘到定序序列尾    if(left_low<=left_high)    {        memcpy(temp+k,arr+left_low,(left_high-left_low+1)*sizeof(int));        for(i=left_low; i<=left_high; i++)        {            temp[k++]=arr[i];        }    }    // 如果第二個序列有剩餘,直接複製出來粘到定序序列尾    if(right_low<=right_high)    {        memcpy(temp+k,arr+right_low,(right_high-right_low+1)*sizeof(int));        for(i=right_low; i<=right_high; i++)        {            temp[k++]=arr[i];        }    }    for(i=0; i<high-low+1; i++)   arr[low+i]=temp[i];    free(temp);    return ;}void merge_sort(int arr[],unsigned int first,unsigned int last){    int mid=0;    if(first<last)    {        mid=(first+last)/2;        merge_sort(arr,first,mid);        merge_sort(arr,mid+1,last);        merge(arr,first,mid,last);    }}

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.