本次所介紹的排序分別是堆排序、歸併排序、快速排序。
void swap(int a,int i,int j);//交換下標為i和j的兩個元素的值
void printa(int a,int len);//列印陣列
堆排序:
堆排序是指利用堆這種資料結構所設計的一種排序演算法,它是選擇排序的一種。在從小到大排序中,需要使用的是大根堆,大根堆的要求是每個節點的值都不大於其父節點的值,根據大根堆的要求可知,最大的值一定在堆頂。這樣每次都可以找到待排序元素中最大元素。**如下:
//調整最大堆
void heapify (int *a,int i,int len)
if (right < len && a[right] > a[max]) //當前最大元素與右孩子比較
if (max != i) }
//排序
void heapsort (int *a,int len)
for (i = len - 1;i > 0;i--) }
int main()
; int len = sizeof(a) / sizeof(a[0]);
heapsort (a,len);
printa (a,len);
return 0;
}
歸併排序:
歸併排序是建立在歸併操作上的一種有效的排序演算法。先讓每個子串行有序,再將已有序的子串行合併,得到完全有序的序列。需要使用到遞迴,並且在合併時,需要建乙個緩衝區。**如下:
//歸併(合併)
void merge (int *a,int left,int right,int mid,int *tmp)
else
}//剩下的全部放入緩衝區
while(i <= mid)
while (j <= right)
k = 0;
for (i = left;i <= right;i++) //將緩衝區的值傳給陣列 }
//排序
void mergesort (int *a,int left,int right,int *tmp)
int mid = (left + right) / 2;
mergesort (a,left,mid,tmp); //歸併排序左邊
mergesort (a,mid + 1,right,tmp); //歸併排序右邊
merge (a,left,right,mid,tmp); //合併
}int main()
; int len = sizeof(a) / sizeof(a[0]);
int tmp[len];
mergesort (a,0,len - 1,tmp);
printa (a,len);
return 0;
}
快速排序:
快速排序的基本思想是選乙個基準值,通過一趟排序將要排序的資料分成兩部分,比基準值小的和比基準值大的分別放在基準值兩邊,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。快速排序是對氣泡排序的一種改進。**如下:
//分割槽操作,返回基準值下標
int partition (int * a,int left,int right)
} swap (a,index,right); //將基準值放到比它大的所有數左邊
return index;
}//排序
void qsort (int *a,int left,int right)
}int main()
; int len = sizeof(a) / sizeof(a[0]);
qsort (a,0,len - 1);
printa (a,len);
return 0;
}
有關排序的更多演算法和**實現以及更高效的排序,希望能與大家交流。
走進資料結構之排序(二) 希爾排序
希爾排序基本思想就是分組的直接插入排序!如何分組呢?希爾排序是以間距來分組的!那間距又如何取呢?希爾排序是以傳進來的資料序列的長度作為間距初始值的,每一趟排序都是將資料序列的一半作為間距來進行排序操作,直到間距取為1,停止排序。有了間距又如何來排序呢?其實就是分組的直接插入排序,只是直接插入排序的間...
資料結構之排序(二) 歸併排序
其思想說白了就是先分後合,先將需要排序的陣列迭代或遞迴每次分成兩份直到分成n個數為止,然後再將n個數涼兩兩排序後合併成n 2個陣列,以此類推直到合併排序成乙個陣列。1 中採用的是線性表的順序儲存結構來存放資料的 typedef void list node 用於復用加入元素 typedef unsi...
資料結構 排序(二)
歸併排序最壞情況下時間複雜度為o nlogn 它所使用的比較次數幾乎是最優的。同時歸併排序是分治策略和遞迴策略的乙個非常好的例項。歸併排序的基本操作是合併兩個已經排序的表。對於乙個要排序的陣列,歸併演算法首先將陣列分為兩部分,然後分別對這兩部分遞迴呼叫自己,這個遞迴演算法的遞迴終止條件是陣列長度為一...