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