再來談談快速排序,遞迴實現與非遞迴實現。
遞迴實現是基本的排序;非遞迴實現需要用stack來儲存 (low, high)的排序對,一部分一部分的排序。
直接上程式了:
標頭檔案 quick_test.h
#include
#include
#include
#include
/#include
#include
typedef
struct region region;
/////#define n 100000000
#define n 15
//#define m 1000000000
#define m 1000
typedef
long data;
void swpdata(data &data1, data &data2);
void quicksort(data *arr, long low, long high);
long partition(data *arr, long low, long high);
void quicksortnew(data *arr, long low, long high);
簡單的排序主函式,quick_test.cpp
#include "quick_test.h"
void swpdata(data &data1, data &data2)
void quicksort(data *arr, long low, long high)
long partition(data *arr, long low, long high)
arr[i] = num;
return i;
}void quicksortnew(data *arr, long low, long high)
if(ind + 1
< j && ind != -1)
}}int main(int argc, char *argv)
srand( (unsigned)time(null) );
data num = 0;
data *arr = new data[n]; //attention
long i = 0;
file *fp;
fp = fopen(argv[1], "wb");
if(null == fp)
for(i = 0; i < n; ++ i)
fclose(fp);
/////////
//////
//////
//////
//////
//////
////////
//quicksort(arr, 0, n - 1);
quicksortnew(arr, 0, n - 1);
/////////
//////
//////
//////
//////
//////
////////
char line[10240];
snprintf(line, 10240, "%s.sort", argv[1]);
fp = fopen(line, "wb");
if(null == fp)
for(i = 0; i < n; ++ i)
fprintf(fp, "%ld\n", arr[i]);
delete arr; //attention
return
0;}
這裡值得一提的是,堆與棧空間的分配問題,定義的變數在棧空間,棧空間對資料的大小有很大的限制,最大到十萬級,當直接分配百萬級的空間,程式在執行時會出core,然而用堆就可以實現百萬千萬的空間分配。
堆空間分配變數,new與delete,現在明白堆空間的方便與靈活之處了,也就是**中標示 attention之處
快速排序實現(遞迴 非遞迴)
首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 int partition int a,int low,int high a low pivot 將樞軸值元素置於最終位置 return low 第乙個while迴圈裡的 還可以採用如下形式 while low high a high...
快速排序的非遞迴實現
首先說明一下快速排序是對氣泡排序的改進。為什麼這麼說呢?想一下氣泡排序,它把序列分成了兩部分,前半部分無序,後半部分公升序排列,並且後半部分的數都大於前半部的數。由此可得到快速排序和氣泡排序的一些共同點 都要經歷n趟排序 每趟排序要經歷o n 次比較 都是後半部分元素比前半部大 而不同之處就在於氣泡...
快速排序的非遞迴實現
首先說明一下快速排序是對氣泡排序的改進。為什麼這麼說呢?想一下氣泡排序,它把序列分成了兩部分,前半部分無序,後半部分公升序排列,並且後半部分的數都大於前半部的數。由此可得到快速排序和氣泡排序的一些共同點 都要經歷n趟排序 每趟排序要經歷o n 次比較 都是後半部分元素比前半部大 而不同之處就在於氣泡...