排序算法動圖詳解與代碼實現(交換排序篇)

1.冒泡排序
思想:從第一個元素開始,兩兩比較相鄰元素a1,a2,當a1>a2時,交換順序,比較下一組元素,循環操作,直到整個數組有序。
在這裏插入圖片描述
優點:穩定

缺點:效率低

代碼實現

void bubble_sort(int* arr,int len)
{
    if(arr == NULL || len < 0)
        return ;
    bool flag = true;
    for(int i=0;i<len-1 && flag;i++)
    {
        flag = false;
        for(int j=0;j<len-i-1;j++)
        {
            if(arr[j] > arr[j+1])
            {
                flag = true;
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

2.快速排序
思想:首先確定基準點的值,目地是將基準點防止到指定位置,使得左邊數據小於基準點,右邊數據大於基準點,隨後進行左右子串的遞歸排序,直到整個數組有序。

算法解讀:選取中間變量暫存基準點的值,指定i,j兩個指針,i指針從後向前遍歷,直到找到比基準點小的數據後停下,用該數據的值覆蓋基準點位置上的值,隨後j指針從前向後遍歷,直到找到比基準點大的數據後停下,用該數據的值覆蓋i指針位置上的值,重複i,j指針的遍歷,直到i=j,用基準點上的值覆蓋該位置上的值,完成一次基準點位置的確認,然後進行左右子串的遞歸遍歷,直到整個數組有序。
ps:動圖所展示的在找到基準點後子串的排序算法與常見快排略有不同,代碼實現以上述提到的思想爲主,動圖僅供參考。

優點:數據移動少

缺點:不穩定

代碼實現

#include <stdio.h> 

void sort(int a[], int left, int right) {
	if(left >= right)//如果left大於或者等於right就代表已經整理完成一個部分了 
	{ return;} 
	int i = left;
	int j = right;
	int key = a[left];//選取基準點
	while(i < j)//當i和j"相遇"的時候,說明所有元素都被比較了一遍,這時候就不用再循環
    {
    	 while(i < j && key <= a[j]) {
      	 j--;//向前尋找 } 
      	 a[i] = a[j];//數值覆蓋
    	 while(i < j && key >= a[i]) { 
       	 i++;//向後尋找} 
        a[j] = a[i];//數值覆蓋
     }
        a[i] = key;//確定基準點位置
        sort(a, left, i - 1);//對左子串進行遞歸排序
        sort(a, i + 1, right);//對右子串進行遞歸排序
 }

void main() { 
  int a[]={5,6,1,4,9,2,9};
  int i; 
  int length=sizeof(a)/sizeof(int); 
  sort(a,0,length-1); 
  for(i=0;i<length;i++){
   printf("%d\t",a[i]);} 
   printf("\n"); 
 }

3.二者複雜度比較
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章