這篇文章主要和大家分享三種基礎的排序演算法——冒泡排序、選擇排序、快速排序
一、排序問題
1.冒泡排序
冒泡排序的主要思想是通過兩兩相鄰的元素進行比較,通過元素的大小決定是否交換,一趟冒泡排序的結果是一定有一個最大數會排到最后一個元素;因此對n個數進行排序,需要進行n-1躺冒泡排序,
void bubble_sort(int arr[],int x)//注意形參arr傳遞的是地址
int i=0;
for(i=0;i<sz-1;i++)//冒泡排序的趟數
{
int j=0;
int float=1;//如果float的值沒有發生改變,說明上一躺的冒泡排序就達到了結果
for(j=0;j<sz-1-i;j++)//最后i個數的順序已經排好,使用只需要排余下的sz-1-i個數
{
if(arr[j]>arr[j+1])
{
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
float=0;
}
//進行一次冒泡排序
if(float==1)
break;
}
}
int main()
{
int arr[]={9,8,7,6,5,4,3,2,1,0};
int sz=sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,sz);
return 0;
}
2.選擇排序
選擇排序的主要思路是:先從待排序的元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然后再從剩余的未排序元素中尋找到最小(大)元素,然后放到已排序的序列的末尾,以此類推,直到全部待排序的元素的個數為零,
int main()
{
int j=0;
int i=0;
int tmp=0;
int k;
int arr[]={4,5,6,72,1,7,9,3}
int sz=sizeof(arr)/sizeof(arr[0])-1;
for(i=0;i<=sz;i++)
{
k=i;
for(j=i+1;j<=sz;j++)
{
if(arr[j]>arr[k])
{
k=j;
}//找到最大的數的下標
}
if(k!=i)
{
tmp=arr[k];
arr[k]=arr[i];
arr[i]=tmp;//交換數值
}
}
for(i=;i<=sz;i++)
{
printf("%d",arr[i]);
}
return 0;
}
3.快速排序
快速排序的思路:選擇一個關鍵資料(一般選擇第一個),然后先從左到右,直到找到第一個大于關鍵資料的數,并把這個數放在關鍵資料的后面,然后從右到左,直到找到第一個小于關鍵資料的數,并放在關鍵資料的前面,直到把所有比關鍵資料大的數都放在它的后面,把所有比關鍵資料小的數放在它的前面,這為一次快速排序;然后對關鍵資料左邊和右邊的陣列分別再進行同樣的操作......反復進行,每次選擇合適的關鍵資料,最后就可以得到一個從小到大的排序;
初始陣列:
| 3 | 5 | 2 | 1 | 4 | 6 |
第一次排序,以3為關鍵資料,把陣列分為大于3和小于3的兩部分,
| 2 | 1 | 3 | 5 | 4 | 6 |
第二次排序,左邊以2為關鍵資料,右邊以5為關鍵資料
| 1 | 2 | 3 | 4 | 5 | 6 |
#include<stdio.h>
#incldue<string.h>
void fast(int left;int right)//left,right分別是陣列的第一個元素的索引和最后一個元素的索引
{
if(left>=right)//已經排序完成
{
return 0;
}
int i=left;
int j=right;
int key=arr[i];//關鍵資料
while(i<j)//i>j說明排序完成
{
while(i<j)
{
if(arr[j]>=key)
j--;//從最后往前尋找小于key的數
else
{
arr[i]=arr[j];
break;
}
}
while(i<j&&key>=arr[i])
i++;
arr[j]=arr[i];
}
arr[i]=key;
fast(left,i-1);
fast(i+1,right);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317918.html
標籤:其他
