数据结构 快速排序(详解)
生活随笔
收集整理的這篇文章主要介紹了
数据结构 快速排序(详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 快速排序
1:快速排序的思想
? ? 快速排序運用了分治的思想,即通過一趟排序 將序列分為兩部分,根據選取的基準,?將比基準小的數放在基準前面,將比基準大的數放在的數放在基準后面;然后對兩部分進行遞歸處理,以達到整個序列有序的狀態。
2:快速排序的步驟
? ?(1):選擇基準 在一個待排序列中找一個 待排的數作為基準;
? ?(2):分割操作 根據基準將序列分為兩部分?
? ?(3):將分割后的序列進行遞歸操作;
3:選擇基準的方法
(1):固定基準:即選取序列的第一個數或最后一個數作為基準;(耗費時間長)
(2):三數取中:即將序列中的首 中 尾 三個數 取出來 進行比較取 中間那個數;
4:運算最快的代碼組合之一
? ? 三數取中 + 插排?
#include<stdio.h>void swap(int a, int b){int temp;temp = a;a = b;b = temp; }//插入排序 void Insertion_sort(int A[], int low, int high){int P,i; int N = high - low;for(P = 1; P < N; P++){int temp = A[P];for(i = P; i > 0 && A[i-1] >= temp; i--){A[i] = A[i-1];A[i-1] = temp; }} } //選取 一個基準 進行 分成兩部分 //使用三數取中法選擇樞軸 //int getstandard(int A[], int i, int j){ // // int mid = i + ((j - i) >> 1);//計算數組中間的元素的下標 // // //使用三數取中法選擇樞軸 // if (A[mid] > A[j])//目標: arr[mid] <= arr[high] // { // swap(A[mid],A[j]); // } // if (A[i] > A[j])//目標: arr[low] <= arr[high] // { // swap(A[i],A[j]); // } // if (A[j] > A[i]) //目標: arr[low] >= arr[mid] // { // swap(A[mid],A[i]); // } // //此時,arr[mid] <= arr[low] <= arr[high] // int key = A[i]; // //low的位置上保存這三個位置中間的值 // //分割時可以直接使用low位置的元素作為樞軸,而不用改變分割函數了 // // while(i < j){ // // while(i < j && A[j] >= key){ // j--; // } // if(i < j && A[j] < key){ // A[i] = A[j]; // } // // while(i < j && A[i] <= key){ // i++; // } // if(i < j && A[i] > key){ //前面的數如果大于key的話 就將前面的數放到后面? // A[j] = A[i]; // } // } // //出這個循環 // A[i] = key; // return i ; //}//此為選取第一個 數據作為基準 int getstandard(int A[], int left, int right){int i = left,j = right;int key = A[left];//選取 第一個數據為基準while(i < j){while(i < j && A[j] >= key){j--;} while(i < j && A[i] <= key){i++;}//當發現 從右邊開始發現有比基準數小的時候,從左邊開始 遇到比基準數大的時候//交換兩個數 if(i < j){swap(A[i],A[j]);}} //出這個循環 交換基準數 和 i 與 j 相等時那個位置的數 A[left] = A[i];A[i] = key;return i; }void QuickSort(int A[] ,int low ,int high){if(low < high){int standard = getstandard(A, low, high);//遞歸兩部分 QuickSort(A, low, standard-1);QuickSort(A, standard+1, high); }//當數據小于10的時候選擇插入排序明顯 比 快排速度更快 if(high - low < 10)Insertion_sort(A, low, high); } int main(){int i,n;scanf("%d",&n);int a[n];for(i=0; i<n; i++){scanf("%d",&a[i]);}QuickSort(a,0,n-1);for(i=0; i<n; i++){printf("%d ",a[i]);} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的数据结构 快速排序(详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天只吃蔬菜水果,喝酸奶可以减肥吗
- 下一篇: 创建链表小细节(引用传递和值传递以及链表